Wie der Titel schon sagt, werden Bilddaten, die von OpenCV / numpy usw. verarbeitet werden, im Qt (pyqt5) -Widget angezeigt. Es ist nicht so schwierig, aber ich werde es als Memo veröffentlichen.
Hier ist ein Beispiel mit PyQt5, einem Qt-Wrapper, der von Python aus verwendet werden kann. Die Hauptpunkte sind in C ++ dieselben, außer dass sich die Beschreibungsmethode ändert.
Konvertieren Sie zunächst das Bildarray (im Speicher erweitert) in "QPixmap".
Wie Sie der folgenden Quelle entnehmen können, müssen die Daten im ARGB-Format vorliegen. Wenn es sich also um Daten im Graustufen- oder RGB-Format handelt, müssen diese vorab mit cvtColor ()
von OpenCV in das ARGB-Format konvertiert werden.
import PyQt5.QtCore as QtCore
import PyQt5.QtGui as QtGui
import PyQt5.QtWidgets as QtWidgets
def create_QPixmap(image):
qimage = QtGui.QImage(image.data, image.shape[1], image.shape[0], image.shape[1] * 4, QtGui.QImage.Format_ARGB32_Premultiplied)
pixmap = QtGui.QPixmap.fromImage(image)
return pixmap
Um es anzuzeigen, ist es notwendig, diese "QPixmap" auf ein "QWidget" zu zeichnen.
Daher ist es bequem, "QWidget" zu erweitern und eine Klasse zu erstellen.
In dieser Klasse habe ich versucht, paintEvent ()
, das beim Zeichnen des Widgets aufgerufen wird, zu erweitern, um das Bild darin zu zeichnen. Wenn Sie schneller zeichnen möchten, sollten Sie OpenGL verwenden.
Der Punkt ist, QtGui.QPainter
zu verwenden.
class ImageWidget(QtWidgets.QWidget):
def __init__(self, image):
super(ImageWidget, self).__init__()
self.image = image
def paintEvent(self, event):
painter = QtGui.QPainter(self)
if self.image is None:
painter.setPen(QtCore.Qt.black)
painter.setBrush(QtCore.Qt.black)
painter.drawRect(0, 0, self.width(), self.height())
return
pixmap = create_QPixmap(self.image)
painter.drawPixmap(0, 0, self.image.shape[1], self.image.shape[0], pixmap)
def set_image(self, image):
self.image = image
self.update()
Das ist es! Es ist schneller als die Verwendung von "matplotlib", es ist nicht so einfach wie "imshow ()" von OpenCV und es kann in eine richtige GUI-Form gebracht werden als die Verwendung von "pygame". Verwenden wir es je nach Zweck richtig.