当前位置: 首页 > 面试题库 >

opencv BGR图像及其反向版本RGB图像[:,:,::-1]有什么区别?

费德宇
2023-03-14
问题内容

我正在尝试显示带有QLabel的opencv图像。我有两种不同版本的图像,第一种是opencv BGR图像,第二种是使用image
[:,:,::-1]的RGB图像,BGR版本可以正常工作,但RGB版本不起作用。

下面的代码工作正常

src = cv.imread('image.jpg')
h,w,ch = src.shape
bytesPerLine = ch * w
qImg = QImage(src.data, w, h, bytesPerLine, QImage.Format_RGB888)
qImg = qImg.rgbSwapped()
self.ui.label.setPixmap(QPixmap.fromImage(qImg))

这些代码不起作用:

src = cv.imread('image.jpg')
src = src[:,:,::-1]
h,w,ch = src.shape
bytesPerLine = ch * w
qImg = QImage(src.data, w, h, bytesPerLine, QImage.Format_RGB888)
self.ui.label.setPixmap(QPixmap.fromImage(qImg))

问题答案:

如您所见,opencv读取BGR格式的图像,但读取RGB的QImage图像,在第一种方法中,您无需转换即可转换为QImage,然后使用rgbSwapped()method进行转换。

通过测试第一种方法,我得到:

1000 loops, best of 5: 291 usec per loop

在第二种方法中,您尝试在将其转换为QImage之前执行此操作,但是当我执行它时,假定您也获得了它,则会出现以下错误。

Traceback (most recent call last):
  File "xxxx.py", line 18, in <module>
    qImg = QtGui.QImage(src.data, w, h, bytesPerLine, QtGui.QImage.Format_RGB888)
TypeError: arguments did not match any overloaded call:
  QImage(): too many arguments
  QImage(QSize, QImage.Format): argument 1 has unexpected type 'memoryview'
  QImage(int, int, QImage.Format): argument 1 has unexpected type 'memoryview'
  QImage(bytes, int, int, QImage.Format): argument 1 has unexpected type 'memoryview'
  QImage(sip.voidptr, int, int, QImage.Format): argument 1 has unexpected type 'memoryview'
  QImage(bytes, int, int, int, QImage.Format): argument 1 has unexpected type 'memoryview'
  QImage(sip.voidptr, int, int, int, QImage.Format): argument 1 has unexpected type 'memoryview'
  QImage(List[str]): argument 1 has unexpected type 'memoryview'
  QImage(str, format: str = None): argument 1 has unexpected type 'memoryview'
  QImage(QImage): argument 1 has unexpected type 'memoryview'
  QImage(Any): too many arguments

这是因为numpy使用memoryview来优化某些任务。在这种情况下,当src[:,:,::-1]一种优化方法不是修改数据而是访问数据的方法时,这是通过Buffer
Protocol进行的

并且在这种情况下,QImage不支持这种类型的数据,因此解决方案是使用tobytes()or来访问字节bytes()

import cv2
from PyQt5 import QtGui, QtWidgets

if __name__ == '__main__':
    import sys
    src = cv2.imread('image.jpg')
    src = src[:,:,::-1]
    h, w, ch = src.shape
    bytesPerLine = ch * w
    qImg = QtGui.QImage(src.data.tobytes(), w, h, bytesPerLine, QtGui.QImage.Format_RGB888)
    # Or
    # qImg = QtGui.QImage(bytes(src.data), w, h, bytesPerLine, QtGui.QImage.Format_RGB888)
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QLabel()
    w.setPixmap(QtGui.QPixmap.fromImage(qImg))
    w.show()
    sys.exit(app.exec_())

时间:

500 loops, best of 5: 523 usec per loop

另一种解决方案是使用cvtColor()opencv的功能,如果您修改了数据,则:

import cv2
from PyQt5 import QtGui, QtWidgets

if __name__ == '__main__':
    import sys
    src = cv2.imread('image.jpg')
    src = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)
    h, w, ch = src.shape
    bytesPerLine = ch * w
    qImg = QtGui.QImage(src.data, w, h, bytesPerLine, QtGui.QImage.Format_RGB888)
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QLabel()
    w.setPixmap(QtGui.QPixmap.fromImage(qImg))
    w.show()
    sys.exit(app.exec_())

时间:

1000 loops, best of 5: 263 usec per loop


 类似资料:
  • 高山码头工人形象和忙碌的码头工人形象有什么区别? 当我检查他们的DockFile时,alpine是这样的(对于alpine v3.12-3.12.7) busybox是这样的 但作为https://alpinelinux.org/about/说 Alpine Linux是围绕musl libc和busybox构建的。 那么到底有什么区别呢? 我也很好奇,许多docker图像(nodejs/ngin

  • 在这种情况下,这些rest层ID是否与其他一些图像相对应呢?如果是真的,我可以视图层为图像吗?

  • 本文向大家介绍图像的像素数与分辨率有什么区别?相关面试题,主要包含被问及图像的像素数与分辨率有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 像素数为图像实际组成的像素的个数,像素是没有固定宽度和高度的,是一个感光单元。 分辨率的单位为 像素/英寸(1英寸(inch)=2.54厘米(cm)),这里指的不是面积,而是对角线的长度,即dpi、ppi。分辨率也称之为点密度,分辨率越高,看的越细腻。

  • 我有一个非常简单的dockerfile 然后使用 根据我对Docker的了解,当我键入时,它应该只在下显示;但是这不是发生的事情。相反,我看到: 为什么会出现基础图像?例如,我从中提取的存储库 但这并没有出现。那么在这种情况下,为什么会有基础图像呢?

  • 容器和Docker中的图像有什么区别?在“开始使用Docker”教程中,这两个术语都使用过,但我不理解它们之间的区别。 有谁能说点什么吗?

  • 我目前正在运行官方的ghost Docker映像,并使用该映像构建几个容器。 如果我想更新my Docker映像,我只需使用以下命令: