PyQt&OpenCV编程

Wikipedia,自由的百科全书
跳转至: 导航搜索

说明: 该例程由 chai2010 编写.

PyQt是Qt的python绑定, 适合快速开发界面程序. 我使用的PyQt中集成的是Qt4.4, 因此, QImage新支持Format_RGB888图像格式. 需要注意的是, Format_RGB888格式 中的RB顺序和OpenCV默认顺序是反的.

基于Format_RGB888格式, 我们可以很容易将IplImage转换为一个QImage:

<source lang="c">IplImage *pImg = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_COLOR); QImage image(pImg->imageData, pImg->width, pImg->height, pImg->widthStep, QImage::Format::Format_RGB888);</source>

PyQt中也是采用同样的方式处理, 下面是我写的一个例子:

<source lang="python"># -*- coding:utf-8 -*-

  1. PyQt+OpenCV example
  2. PyQt中显示一副图像
  3. By 柴树杉(chaishushan@gmail.com) 2008

import sys from PyQt4.Qt import *

from opencv.cv import * from opencv.highgui import *

class MyWidget(QWidget):

   def __init__(self, parent=None):
       QWidget.__init__(self, parent)
       
       # 用OpenCV函数打开图像
       
       self.image = cvLoadImage("lena.jpg")
       
   def paintEvent(self, event):
       
       if not self.image:
           return
       
       # IplImage属性
       
       w = self.image.width
       h = self.image.height
       
       step = self.image.widthStep
       data = self.image.imageData
       
       # 直接从imageData构造QImage
       # 假设是IPL_DEPTH_8U类型3通道彩色图像
       
       img = QImage(data, w, h, step, QImage.Format_RGB888)
       
       # 交换RB通道
       # 也可以用OpenCV的cvConvertImage函数交换
       
       img = img.rgbSwapped()
       
       # 显示图像
       
       painter = QPainter(self)
       painter.drawImage(self.rect(), img, img.rect())


if __name__ == '__main__':

   app = QApplication(sys.argv)
   
   hello = MyWidget()
   hello.show()
   
   sys.exit(app.exec_())</source>

对于QImage向IplImage转化也可以采用类似的方式, 然后将QImage中的内部数据用cvInitImageHeader 和cvSetData来进行包装.

以上的方法是针对IPL_DEPTH_8U类型的图像, 对于比较特殊的格式可能需要手工转化.

对于PyQt感兴趣的朋友可以参考我翻译的一篇文档: PyQt4 编程简介.