今天写opencv的时候, 突然发现一件很奇怪的事情, 用摄像头读取的图片, 用QImage加载的时候传入img.data, 一切都很正常, 但是如果我是从保存的图片读取灰度图, 传入img.data, 它会告诉我QImage不能传入memoryview, 但是我打了断点, 也打印过, 它们确实都是memoryview, 而且图片的dtype都是uint8, 就有点莫名其妙。
然后我尝试将img.data改成img.tobytes(), 问题解决, 但是又出现一个新的问题, 就是我从图片中截取一部分, 显示后, 虽然显示出来了, 但是内容却产生了形变, 而我在显示前特地用imshow显示了出来, 说明图片是正常的, 就很诡异。
加载代码如下:
ret, img = self.camera.read()
if ret:
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
height, width = img.shape[:2]
img = QImage(img.data, width, height, QImage.Format_Grayscale8)
img = QPixmap.fromImage(img)
self.p_widget.video_label.setPixmap(img)
最后的解决办法是, 先将图片写入到文件, 然后用QImage直接从文件加载, 问题解决。
但是为什么会扭曲的问题依然不是很清楚, 如果有清楚的大佬, 麻烦解答一下。文章来源:https://www.toymoban.com/news/detail-849505.html
memoryview的问题盲猜是表示一个内存数据结构, 这个结构里的数据类型, 字节排序等不一致导致的。文章来源地址https://www.toymoban.com/news/detail-849505.html
到了这里,关于QImage加载opencv读取的图片出错的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!