• Open Source Computer Vision Library

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 编程简介.

Views
Personal tools