PyQt&OpenCV编程
Wikipedia,自由的百科全书
说明: 该例程由 chai2010 编写.
PyQt是Qt的python绑定, 适合快速开发界面程序. 我使用的PyQt中集成的是Qt4.4, 因此, QImage新支持Format_RGB888图像格式. 需要注意的是, Format_RGB888格式 中的RB顺序和OpenCV默认顺序是反的.
基于Format_RGB888格式, 我们可以很容易将IplImage转换为一个QImage:
IplImage *pImg = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_COLOR); QImage image(pImg->imageData, pImg->width, pImg->height, pImg->widthStep, QImage::Format::Format_RGB888);
PyQt中也是采用同样的方式处理, 下面是我写的一个例子:
# -*- coding:utf-8 -*- ########################################################### # PyQt+OpenCV example # # PyQt中显示一副图像 # # 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_())
对于QImage向IplImage转化也可以采用类似的方式, 然后将QImage中的内部数据用cvInitImageHeader 和cvSetData来进行包装.
以上的方法是针对IPL_DEPTH_8U类型的图像, 对于比较特殊的格式可能需要手工转化.
对于PyQt感兴趣的朋友可以参考我翻译的一篇文档: PyQt4 编程简介.


