絵: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番目の問題は、画像を描画した後に、選択したリージョンマスクを取得する方法です。 アルファチャンネルを使用して新しい画像を作成してから、ピクセル値を抽出するのと同じようなものがありますか? または、空のイメージに平行してペイントしますか?次に、ズームイン/アウトを追跡する必要があります。
ありがとうございました。私はあなたの推薦に固執し、最初のアプローチを試みると思います。どのようなサンプルコードを知っていますか?参考になるオープンソースソフトウェアですか? (imagewiever.pyサンプルを除いて、これも非常に役に立ちます) – Mutebessim
C++を読む(または同等のPythonバージョンを見つける)と仮定して、デモの "Graphics View"セクションを見てください(http://doc.trolltech。 com/4.7/demos.html)とサンプル(http://doc.trolltech.com/4.7/examples-graphicsview.html) –