• 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:

  1. IplImage *pImg = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_COLOR);
  2. QImage image(pImg->imageData, pImg->width, pImg->height, pImg->widthStep, QImage::Format::Format_RGB888);

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

  1. # -*- coding:utf-8 -*-
  2. ###########################################################
  3. # PyQt+OpenCV example
  4. #
  5. # PyQt中显示一副图像
  6. #
  7. # By 柴树杉(chaishushan@gmail.com) 2008
  8. ###########################################################
  9.  
  10. import sys
  11. from PyQt4.Qt import *
  12.  
  13. from opencv.cv import *
  14. from opencv.highgui import *
  15.  
  16. class MyWidget(QWidget):
  17. def __init__(self, parent=None):
  18. QWidget.__init__(self, parent)
  19.  
  20. # 用OpenCV函数打开图像
  21.  
  22. self.image = cvLoadImage("lena.jpg")
  23.  
  24. def paintEvent(self, event):
  25.  
  26. if not self.image:
  27. return
  28.  
  29. # IplImage属性
  30.  
  31. w = self.image.width
  32. h = self.image.height
  33.  
  34. step = self.image.widthStep
  35. data = self.image.imageData
  36.  
  37. # 直接从imageData构造QImage
  38. # 假设是IPL_DEPTH_8U类型3通道彩色图像
  39.  
  40. img = QImage(data, w, h, step, QImage.Format_RGB888)
  41.  
  42. # 交换RB通道
  43. # 也可以用OpenCV的cvConvertImage函数交换
  44.  
  45. img = img.rgbSwapped()
  46.  
  47. # 显示图像
  48.  
  49. painter = QPainter(self)
  50. painter.drawImage(self.rect(), img, img.rect())
  51.  
  52.  
  53. if __name__ == '__main__':
  54. app = QApplication(sys.argv)
  55.  
  56. hello = MyWidget()
  57. hello.show()
  58.  
  59. sys.exit(app.exec_())

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

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

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

Views
Personal tools