• Open Source Computer Vision Library

PyQt实现edge例程

Wikipedia,自由的百科全书

说明: 该例程由 chai2010 编写.

首先设计UI界面, 调整自己满意的布局.

其中黑色为 QLabel, 对象名为labelImage, 用于显示图像. 左下角为拖动条, 对称为sliderThreshold, 用于修改参数.

Open按钮用于打开文件, 对象名为openButton.

在界面编辑器中, 将Close按钮的clicked信号连接到窗口的close槽.

Image:Pyqt-edge-01.png

窗口设计完成后保存到edge.ui, 然后基于edge.ui文件构造程序:

  1.  
  2. # -*- coding:utf-8 -*-
  3. ###########################################################
  4. # PyQt+OpenCV example
  5. #
  6. # 查找图像中的边界.
  7. # 参考 OpenCV\samples\python\edge.py 改写
  8. #
  9. # By 柴树杉(chaishushan@gmail.com) 2008
  10. ###########################################################
  11.  
  12. import sys
  13.  
  14. # 导入PyQt模块
  15.  
  16. from PyQt4.Qt import *
  17. from PyQt4 import uic
  18.  
  19. # 导入OpenCV模块
  20.  
  21. from opencv.cv import *
  22. from opencv.highgui import *
  23.  
  24. # 边界检测类
  25.  
  26. class WinEdge(QWidget):
  27. def __init__(self, parent=None):
  28. QWidget.__init__(self, parent)
  29. uic.loadUi("edge.ui", self)
  30.  
  31. # OpenCV相关参数
  32.  
  33. self.cv_img = None
  34. self.cv_col_edge = None
  35. self.cv_gray = None
  36. self.cv_edge = None
  37.  
  38. # 标题
  39.  
  40. self.defaultTitle = self.windowTitle()
  41.  
  42.  
  43. @pyqtSignature("")
  44. def on_openButton_clicked(self):
  45. filename = QFileDialog.getOpenFileName(self,
  46. self.tr("Choose a Image"), ".",
  47. self.tr("Image Files (*.jpg;*.bmp);;All Files (*)"))
  48.  
  49. if not filename.isEmpty():
  50. self.sliderThreshold.setEnabled(False)
  51.  
  52. self.openImage(filename)
  53. self.dectorEdge(self.sliderThreshold.value())
  54.  
  55. # 更新UI
  56.  
  57. if self.cv_col_edge:
  58.  
  59. self.setWindowTitle(filename)
  60. self.sliderThreshold.setEnabled(True)
  61.  
  62. else:
  63.  
  64. self.setWindowTitle(self.defaultTitle)
  65. self.sliderThreshold.setEnabled(False)
  66.  
  67. @pyqtSignature("int")
  68. def on_sliderThreshold_valueChanged(self, val):
  69.  
  70. # 重新计算边界
  71.  
  72. self.dectorEdge(val)
  73.  
  74. def resizeEvent(self, event):
  75. self.showImage()
  76.  
  77. # 打开图像
  78.  
  79. def openImage(self, qstringName):
  80.  
  81. # 将QString转换为char *
  82.  
  83. filename = qstringName.toLocal8Bit().data()
  84.  
  85. # 释放以前的图像
  86.  
  87. if self.cv_img :
  88. cvReleaseImage( self.cv_img ); self.cv_img = None
  89. cvReleaseImage( self.cv_col_edge ); self.cv_col_edge = None
  90. cvReleaseImage( self.cv_gray ); self.cv_gray = None
  91. cvReleaseImage( self.cv_edge ); self.cv_edge = None
  92.  
  93. # 打开新的图像
  94.  
  95. self.cv_img = cvLoadImage(filename)
  96. if not self.cv_img:
  97. msg = self.tr("Can't open %1 file!").arg(filename)
  98. QMessageBox.warning (self, "Warning", msg)
  99. return False
  100.  
  101. # 创建辅助空间
  102.  
  103. size = cvSize(self.cv_img.width, self.cv_img.height)
  104.  
  105. self.cv_col_edge = cvCreateImage (size, 8, 3)
  106. self.cv_gray = cvCreateImage (size, 8, 1)
  107. self.cv_edge = cvCreateImage (size, 8, 1)
  108.  
  109. return True
  110.  
  111. # 生成边界
  112.  
  113. def dectorEdge(self, position):
  114.  
  115. if not self.cv_img: return
  116.  
  117. # 转换为灰度
  118.  
  119. cvCvtColor (self.cv_img, self.cv_gray, CV_BGR2GRAY)
  120.  
  121. cvSmooth (self.cv_gray, self.cv_edge, CV_BLUR, 3, 3, 0)
  122. cvNot (self.cv_gray, self.cv_edge)
  123.  
  124. # run the edge dector on gray scale
  125.  
  126. cvCanny (self.cv_gray, self.cv_edge, position, position * 3, 3)
  127.  
  128. # 结构保存到cv_col_edge中
  129.  
  130. cvSetZero (self.cv_col_edge)
  131. cvCopy (self.cv_img, self.cv_col_edge, self.cv_edge)
  132.  
  133. # 显示
  134.  
  135. self.showImage()
  136.  
  137. # 显示图像
  138.  
  139. def showImage(self):
  140.  
  141. if not self.cv_col_edge: return
  142.  
  143. # 转化IplImage为QImage
  144.  
  145. w = self.cv_col_edge.width
  146. h = self.cv_col_edge.height
  147.  
  148. step = self.cv_col_edge.widthStep
  149. data = self.cv_col_edge.imageData
  150.  
  151. img = QImage(data, w, h, step, QImage.Format_RGB888).rgbSwapped()
  152.  
  153. # 显示图像[缩放到窗口大小]
  154.  
  155. size = self.labelImage.size()
  156. self.labelImage.setPixmap(QPixmap.fromImage(img.scaled(size)))
  157.  
  158.  
  159. if __name__ == '__main__':
  160.  
  161. app = QApplication(sys.argv)
  162. widget = WinEdge()
  163. widget.show()
  164. app.exec_()
  165.  

运行结果如图:

Image:Pyqt-edge-02.png

Views
Personal tools