Python 2.7和Opencv 3.0.0中的cvtColor无法进行BGR/RGB转换

6

我知道我可能在要求一个未完成版本的OpenCV做很多事情,但我遇到了一些奇怪的问题,而且似乎没有其他人遇到过。首先,我正在使用PyQt4,QThreads,Python 2.7和opencv在beaglebone黑色上编写一个多线程GUI应用程序。我的当前源代码可以在这里找到。我最初使用的是Debian存储库中的opencv版本,但它太过时了,没有我想要的一些功能,即simpleblobdetector类,并且非常缓慢。考虑到这一点,我从头编译了最新的opencv 3.0.0,自那以后它的表现就很奇怪。我最终将其缩小到与cvtColor有关的问题。然后我简化了代码,以确保不是其他原因导致问题。以下是我一直用于测试的代码:

import cv2

img = cv2.imread('images/original_image.png', cv2.IMREAD_COLOR)

rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
bgr_img = cv2.cvtColor(rgb_img, cv2.COLOR_RGB2BGR)

cv2.imwrite("images/after_convert_to_rgb.png", rgb_img)
cv2.imwrite("images/after_convert_to_gray.png", gray_img)
cv2.imwrite("images/after_convert_back_to_bgr.png", bgr_img)

这段代码生成的图片可以在这里找到。
毫无疑问,我在这一点上感到困惑。我发现将图像转换为灰度时完美地工作,而其他两个则根本不起作用。我有几个与opencv合作的朋友检查了我的原始代码和这个测试代码,但没有发现任何问题。虽然不是作为此测试代码的一部分,但我确实尝试从各种来源读取不同文件格式和图像。它也会对来自VideoCapture类的opencv帧进行操作,因为那是我第一次看到这个问题并且我最终要做的事情。
因此,有人在opencv 3.0中见过这样的情况吗?我最好自定义编译opencv 2.4并使用它吗?我本来就会这样做,但我遵循的是专门为beaglebone黑色定制编译opencv的指南,它们都使用了最新的3.0,所以我认为没问题。无论如何,在我再次执行编译过程之前,我觉得值得检查一下,因为它常常需要我花费几天时间才能正确执行,而且会在夜间进行。
编辑: 以防其他人寻找并想知道我发现了什么。这绝对是我下载的opencv 3.0预发布版中的一个错误。我无法找到该版本的修复方法,并最终不得不降级到版本2.4.10。自从降级以来,一切都正常了。

1
看起来像是一个 bug。我认为最好向 OpenCV 问题跟踪器提交 bug 报告:http://code.opencv.org - vinograd47
这是否被证明是一个错误? - ypx
是的,结果证明这是一个错误,我找不到任何答案,所以最后我重新编译了2.4.10并使用它。 - Corwin Perren
1个回答

3

虽然这不是一个“OpenCV解决方案”,但您可以使用纯Python重新排列颜色通道,因为cv2接口使用numpy数组进行数据存储:

rgb_img = bgr_img[:,:,::-1]    #bgr --> rgb
bgr_img = rgb_img[:,:,::-1]    #bgr --> rgb

这个不起作用。我的红色仍然变成蓝色。 - mLstudent33

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接