Donc, comme le titre l'indique, comment afficher les données d'image gérées par OpenCV / numpy etc. sur le widget Qt (pyqt5). Ce n'est pas si difficile, mais je le posterai sous forme de note.
Voici un exemple utilisant PyQt5, un wrapper Qt qui peut être utilisé à partir de Python. Les principaux points sont les mêmes en C ++, sauf que la méthode de description change.
Commencez par convertir le tableau d'images (étendu en mémoire) en QPixmap
.
Comme vous pouvez le voir dans la source ci-dessous, les données doivent être au format ARVB. Donc, s'il s'agit de données au format Niveaux de gris ou RVB, il est nécessaire de les convertir au format ARVB à l'avance avec cvtColor ()
d'OpenCV.
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
Donc, pour l'afficher, il est nécessaire de dessiner ce QPixmap
sur certains QWidget
.
Par conséquent, il est pratique d'étendre QWidget
et de créer une classe.
Dans cette classe, j'ai essayé d'étendre paintEvent ()
, qui est appelé lorsque le widget est dessiné, pour y dessiner l'image. Si vous avez besoin d'un dessin plus rapide, vous devriez peut-être envisager d'utiliser OpenGL.
Le but est d'utiliser QtGui.QPainter
.
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()
C'est tout!
C'est plus rapide que d'utiliser matplotlib
, ce n'est pas aussi simple que ʻimshow ()d'OpenCV, et cela peut être transformé en une interface graphique appropriée que d'utiliser
pygame`. Utilisons-le correctement selon le but.