软件环境: Python3.6 / Python2.7 IDE: PYZO 传送门: http://www.pyzo.org/
需要安装的Python库: numpy cv2 PyQt5 ,安装方法如下
pip install numpy |
pip install opencv-python |
pip install PyQt5 |
个人推荐直接安装Anaconda 3, Anaconda3已内置numpy与PyQt5,只需执行 pip install opencv-pyhton即可
鉴于需要阅读本文的人应该都知道QImage和cv2,直接上代码,觉得有用的话,不妨点赞,让我乐呵乐呵
cv_image = cv2.imread("图片路径") #此语句会返回一个opencv的图片对象cv_image, 将image转换为QImage的方法如下
def CV2QImage(cv_image):
width = cv_image.shape[1] #获取图片宽度
height = cv_image.shape[0] #获取图片高度
pixmap = QPixmap(width, height) #根据已知的高度和宽度新建一个空的QPixmap,
qimg = pixmap.toImage() #将pximap转换为QImage类型的qimg
#循环读取cv_image的每个像素的r,g,b值,构成qRgb对象,再设置为qimg内指定位置的像素
for row in range(0, height):
for col in range(0,width):
r = cv_image[row,col,0]
g = cv_image[row,col,1]
b = cv_image[row,col,2]
pix = qRgb(r, g, b)
qimg.setPixel(col, row, pix)
return qimg #转换完成,返回
将QImage对象转换为cv2可以直接处理的图象,方法如下
def QImage2CV(qimg):
tmp = qimg
#使用numpy创建空的图象
cv_image = numpy.zeros((tmp.height(), tmp.width(), 3), dtype=numpy.uint8)
for row in range(0, tmp.height()):
for col in range(0,tmp.width()):
r = qRed(tmp.pixel(col, row))
g = qGreen(tmp.pixel(col, row))
b = qBlue(tmp.pixel(col, row))
cv_image[row,col,0] = r
cv_image[row,col,1] = g
cv_image[row,col,2] = b
return cv_image
下面是测试上述两个函数的完整测试例程
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import numpy as np
import cv2
def QImage2CV(qimg):
tmp = qimg
#使用numpy创建空的图象
cv_image = np.zeros((tmp.height(), tmp.width(), 3), dtype=np.uint8)
for row in range(0, tmp.height()):
for col in range(0,tmp.width()):
r = qRed(tmp.pixel(col, row))
g = qGreen(tmp.pixel(col, row))
b = qBlue(tmp.pixel(col, row))
cv_image[row,col,0] = r
cv_image[row,col,1] = g
cv_image[row,col,2] = b
return cv_image
def CV2QImage(cv_image):
width = cv_image.shape[1] #获取图片宽度
height = cv_image.shape[0] #获取图片高度
pixmap = QPixmap(width, height) #根据已知的高度和宽度新建一个空的QPixmap,
qimg = pixmap.toImage() #将pximap转换为QImage类型的qimg
#循环读取cv_image的每个像素的r,g,b值,构成qRgb对象,再设置为qimg内指定位置的像素
for row in range(0, height):
for col in range(0,width):
r = cv_image[row,col,0]
g = cv_image[row,col,1]
b = cv_image[row,col,2]
pix = qRgb(r, g, b)
qimg.setPixel(col, row, pix)
return qimg #转换完成,返回
path = "E:\\Temp\\" #存放测试图片的路径,请自行定义
qpixmap = QPixmap(500, 300)
qpixmap.fill(Qt.green)
painter = QPainter()
painter.begin(qpixmap)
painter.setPen(Qt.black)
painter.setBrush(Qt.white)
painter.drawEllipse(QRect(50, 100, 50, 100))
painter.drawLine(0,0,200,100)
painter.end()
qimg = qpixmap.toImage()
qimg.save(path + "qimg-origin.bmp")
image = QImage2CV(qimg)
start_point = (0, 0)
end_point = (250, 300)
line_width = 4
line_type = 8
color = (255,255,0)
cv2.line(image, start_point, end_point, color, line_width, line_type)
qimg_2 = CV2QImage(image)
qimg_2.save(path + "qimg-from-cv_img.bmp")
cv2.imshow("line", image)
cv2.waitKey()
cv2.destroyAllWindows()