Afficher les données d'image gérées par OpenCV / numpy sur Qt Widget

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'utiliserpygame`. Utilisons-le correctement selon le but.

Recommended Posts

Afficher les données d'image gérées par OpenCV / numpy sur Qt Widget
Je souhaite afficher une image sur Jupyter Notebook à l'aide d'OpenCV (mac)
Lisez l'image postée par flask afin qu'elle puisse être manipulée par opencv