2011-07-13 6 views
3

絵:PyQT4 - 私はPyQT4を用いた画像ラベリングツールを記述したい領域を選択するための画像上

  • 負荷指定されたフォルダからの画像の数を、各画像について:
    • ユーザがオブジェクトを選択する(例えば、車)画像から、選択が行われたマウス
    • と、そのオブジェクトの領域をペイントすることにより、オブジェクトマスクは、元画像に重ねて示されていますすべてのオブジェクトの選択が完了
    • は、プログラムは、各オブジェクトマスクを保存し(背景:0、前景:255)別のPNG画像
  • としてユーザが画像
  • のうち/ズームインすることができなければなりません

私は既にwxWidgetsでC++で同様のプログラムを(ズームイン/アウトなしで)書いています。 PyQT4 &の仕組みを学びたいと思っています。 ユーザーがズームイン/アウトしても、最も難しい部分がペイントしてオブジェクトマスクを正しく取得しているようです。

この問題にはどのPyQTクラスが最適でしょうか? オブジェクトマスクを正しく取得できますか(numpy配列のように)して保存できますか?

ありがとうございます。あなたの勧告に続き


私は、画像を表示し、(まだ実験と学習段階中)マウスで画像上に描画するために、コードの一部を書きました。

QGraphicsPixmapItemに画像を保存して、シーンに追加します。 次に、私はpaintメソッドをオーバーライドしてイメージをペイントします。 最後に、マウスイベントをオーバーライドしてマウスの位置を取得し、そこに円を描画します。 マウスを動かすと、古いサークルが削除され、新しいサークルがペイントされます。 つまり、画像自体には円が描かれません。私が思う 絵は、画像上の恒久的であるように、私は、次のようなものを使用する必要があります

painter = QPainter() 
painter.begin(pixmap) 
# here do the drawing 
painter.end() 

しかし、問題は、ペイント機能が既に引数として画家を取ります。再作成ペイント機能内の新しいものは、(明らかに)動作しません。..

ここではコードです:

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class ImageDrawPanel(QGraphicsPixmapItem): 
    def __init__(self, pixmap=None, parent=None, scene=None): 
     super(ImageDrawPanel, self).__init__() 
     self.x, self.y = -1, -1   
     self.radius = 10 

     self.pen = QPen(Qt.SolidLine) 
     self.pen.setColor(Qt.black) 
     self.pen.setWidth(2) 

     self.brush = QBrush(Qt.yellow) 


    def paint(self, painter, option, widget=None):    
     painter.drawPixmap(0, 0, self.pixmap())     
     painter.setPen(self.pen) 
     painter.setBrush(self.brush)   
     if self.x >= 0 and self.y >= 0: 
      painter.drawEllipse(self.x-self.radius, self.y-self.radius, 2*self.radius, 2*self.radius) 
      self.x, self.y = -1, -1 

    def mousePressEvent (self, event): 
     print 'mouse pressed' 
     self.x=event.pos().x() 
     self.y=event.pos().y()    
     self.update() 

    def mouseMoveEvent (self, event): 
     print 'mouse moving' 
     self.x=event.pos().x() 
     self.y=event.pos().y()    
     self.update()   

class MainWindow(QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 

     self.scene = QGraphicsScene() 
     self.scene.setSceneRect(0, 0, 800, 600) 

     pixmap=self.openImage()   
     self.imagePanel = ImageDrawPanel(scene = self.scene) 
     self.imagePanel.setPixmap(pixmap) 
     self.scene.addItem(self.imagePanel) 

     self.view = QGraphicsView(self.scene) 

     layout = QHBoxLayout()   
     layout.addWidget(self.view) 

     self.widget = QWidget() 
     self.widget.setLayout(layout) 

     self.setCentralWidget(self.widget) 
     self.setWindowTitle("Image Draw") 

    def openImage(self): 
     fname = QFileDialog.getOpenFileName(self, "Open image", ".", "Image Files (*.bmp *.jpg *.png *.xpm)") 
     if fname.isEmpty(): return None 
     return QPixmap(fname)   

import sys 
if __name__ == "__main__":  
    app = QApplication(sys.argv) 
    mainWindow = MainWindow() 
    mainWindow.show() 
    sys.exit(app.exec_()) 

私は永久に画像上に描画するために、今何をすべきか? 私はすべてのポイントを保存してペイントで再描画できますが、これは効率的ではありません。 QGraphicsPixmapItem自体ではなく、QGraphicsSceneで描画を行うべきですか?

2番目の問題は、画像を描画した後に、選択したリージョンマスクを取得する方法です。 アルファチャンネルを使用して新しい画像を作成してから、ピクセル値を抽出するのと同じようなものがありますか? または、空のイメージに平行してペイントしますか?次に、ズームイン/アウトを追跡する必要があります。

答えて

3

は、私はより高いレベルから低いレベルに注文しますさまざまなオプションの数を持っている:

  1. 使用QGraphicsSceneQGraphicsView、およびQGraphicsItems。このセットはおそらく、グラフィックスを集中的に使用するための主要なオプションと最良のオプションを形成します。ビューポートとしてQGLWidgetを設定することで、多くのシステムでハードウェアアクセラレーションが可能になります。
  2. QScrollAreaを使用すると、画像を拡大することができます。単純なQLabelにすることができます。表示された領域を変更することで、効果的なズームが可能になります。 QLabelを使用して画像を描画することはできますが、選択した領域を手動で追跡して選択オーバーレイを実行する必要があります。
  3. 単一のQWidgetを使用し、カスタムペイントを行います。さまざまなイベントの後にupdate()を呼び出すと、必要な変更を描画できます。手動ですべてを行うことが期待されます。

私はアプローチ番号1をお勧めします。QGraphicsPixmapItemを使用してイメージを保持できます。次に、選択範囲を表すグラフィックスアイテムを作成し、境界矩形を使用してintersecting領域を探します。 QGraphicsViewでzoomingのすべてを処理できます。

+0

ありがとうございました。私はあなたの推薦に固執し、最初のアプローチを試みると思います。どのようなサンプルコードを知っていますか?参考になるオープンソースソフトウェアですか? (imagewiever.pyサンプルを除いて、これも非常に役に立ちます) – Mutebessim

+0

C++を読む(または同等のPythonバージョンを見つける)と仮定して、デモの "Graphics View"セクションを見てください(http://doc.trolltech。 com/4.7/demos.html)とサンプル(http://doc.trolltech.com/4.7/examples-graphicsview.html) –

関連する問題