PYQT QTGUI.QIMAGE显示图片异常,发生斜偏异常,且黑白显色

在这里插入图片描述

img = cv2.imread(path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
x = img.shape[1]
y = img.shape[0]
frame = QtGui.QImage(img, x, y, QtGui.QImage.Format_RGB888)

QtGui.QImage(uchar * data, int width, int height, int bytesPerLine, Format format)
这里省略了bytesPerLine造成图像显示异常

改正代码

img = cv2.imread(path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
x = img.shape[1]
y = img.shape[0]
frame = QtGui.QImage(img.data, x, y, x*3, QtGui.QImage.Format_RGB888)

参考博客:
https://blog.csdn.net/silenceasas/article/details/107480228
https://blog.csdn.net/ccchen706/article/details/71425653

转载于:
https://www.freesion.com/article/60661116325/

Python PyQt5 GraphicsView 图片显示虚影问题

出现虚影图像部分代码:

item=cv2.imread("D:/Dest/PyQt5ST/qACTION/PIC/actFile_Save.png")
item = cv2.cvtColor(item, cv2.COLOR_BGR2RGB)
x = item.shape[1]  # 获取图像大小
y = item.shape[0]
self.zoomscale = 1  # 图片放缩尺度
frame = QImage(item, x, y, QImage.Format_RGB888)
pix = QPixmap.fromImage(frame)
self.item = QGraphicsPixmapItem(pix)  # 创建像素图元
self.scene = QGraphicsScene()  # 创建场景
self.scene.addItem(self.item)
self.item.setFlag(QGraphicsItem.ItemIsFocusable)  # 选择时出现虚线框
self.item.setFlag(QGraphicsItem.ItemIsMovable)  # 可移动
self.item.setFlag(QGraphicsItem.ItemIsSelectable)  # 可选择
self.scene.clearSelection()
self.item.setSelected(True)
elf.view.setScene(self.scene)

解决:

item=cv2.imread("D:/Dest/PyQt5ST/qACTION/PIC/actFile_Save.png")
item = cv2.cvtColor(item, cv2.COLOR_BGR2RGB)
x = item.shape[1]  # 获取图像大小
y = item.shape[0]
self.zoomscale = 1  # 图片放缩尺度

xs = x * 3
frame = QImage(item.data, x, y, xs, QImage.Format_RGB888)  # 处理图片虚影问题**

pix = QPixmap.fromImage(frame)
self.item = QGraphicsPixmapItem(pix)  # 创建像素图元
self.scene = QGraphicsScene()  # 创建场景
self.scene.addItem(self.item)
self.item.setFlag(QGraphicsItem.ItemIsFocusable)  # 选择时出现虚线框
self.item.setFlag(QGraphicsItem.ItemIsMovable)  # 可移动
self.item.setFlag(QGraphicsItem.ItemIsSelectable)  # 可选择
self.scene.clearSelection()
self.item.setSelected(True)
self.view.setScene(self.scene)

项目使用Pyqt作为UI框架,使用相机线程捕捉image,并在QGraphicsView中显示,遇到以下问题:
1 采集的数据为nparray数据,需转换为QImage 转换代码如下:
img=cv2.resize(src=img,dsize=None,fx=0.2,fy=0.2)
img2=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
self._image = QtGui.QImage(img2[:],img2.shape[1], img2.shape[0],img2.shape[1] * 3, QtGui.QImage.Format_RGB888)
注意:QImage(uchar * data, int width, int height, int bytesPerLine, Format format) 中的bytesPerLine 参数不能省略,负责造成Qimage数据错误,显示图片不正常,此参数设置为image的width*image.channels
2 采集数据的线程为非UI线程,则在QGraphicsView中显示时不仅需要添加Item对象,并且更新显示线程需在UI线程中,否则QGraphicsView不会主动更新显示,使用信号将image放到UI线程中更新即可
3 保证在UI更新时,所需更新的image还未被销毁,由于处于不同的线程,所以image可存储于更新前不会被销毁的对象中

posted @ 2022-08-01 18:22  thicker  阅读(334)  评论(0编辑  收藏  举报