opencv图像分割合成_OpenCV-Python图像转PyQt图像的变形及花屏问题

一、引言

在《PyQt转换显示Python-OpenCV图像实现图形化界面的视频播放》介绍了实现在OpenCV和PyQt之间转换并传递图像实现在PyQt上播放视频图像的功能。其中的关键函数如下:

def cvImgtoQtImg(cvImg): #定义opencv图像转PyQt图像的函数    QtImgBuf = cv2.cvtColor(cvImg,  cv2.COLOR_BGR2BGRA)    QtImg = QtGui.QImage(QtImgBuf.data, QtImgBuf.shape[1], QtImgBuf.shape[0], QtGui.QImage.Format_RGB32)        return QtImg

但在使用该函数将一系列图像转换并用PyQt显示时,发现部分时候存在变形或花屏。下图为截取的原图样例:

80e2d076634d72e3ab9ee26276ff887f.png


下图是部分效果图以及老猿测试时改变转换类型时转换后展示的效果图:

024080af9e6d1d60e3099fbe135df9d4.png


相关图形处理后的结果并不非常固定。

二、问题分析结论

针对上面的问题,老猿参考相关资料,并反复测试和分析,最后得到如下结论:
1、OpenCV的图像确实是BGR类型,包括VideoCapture和imread读取图像都是,而PyQt都是RGB类型,二者需要转换,而上面函数中的转换并不是完成BGR到RGB的转换,而是BGR到BGRA的转换,所以这种处理会导致图像颜色发生变化;
2、OpenCV彩色图像到PyQt彩色图像,需要变换到四通道图像RGBA格式才能完全不变形的显示图像,这儿的原理老猿还没弄清楚,但测试效果就是这样;
3、QImage对象构建时,图像的类型不应该使用Format_RGB32,而应该选择Format_RGB888,这二者是有区别的,关于这点请参考下面介绍的参考博文。

三、优化后的代码

考虑灰度图像的支持,该函数完善后的代码如下:

def cvImgtoQtImg(cvImg,isConvertToGray=False):  # 定义opencv图像转PyQt图像的函数    if isConvertToGray:        QtImgBuf = cv2.cvtColor(cvImg, cv2.COLOR_BGR2GRAY)        QtImg = QtGui.QImage(QtImgBuf.data, QtImgBuf.shape[1], QtImgBuf.shape[0], QtGui.QImage.Format_Grayscale8)    else:                QtImgBuf = cv2.cvtColor(cvImg, cv2.COLOR_BGR2RGBA)        QtImg = QtGui.QImage(QtImgBuf.data, QtImgBuf.shape[1], QtImgBuf.shape[0], QtGui.QImage.Format_RGBA8888 )            return QtImg

这样优化以后,所有OpenCV的图像都能完整的在PyQt中使用,没有任何变形。

参考博文:

感谢CSDN博主"草帽小子说编程"的《QImage图像格式解读》,为本文相关测试提供了关键的帮助。

关于老猿的付费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。

更多内容请大家到CSDN官网“老猿Python”博客或“老猿Python”微信公众号上查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值