opencv中python/cv2和c#/emgu的InRange方法有什么区别?
我正在尝试把一个小的 OpenCV Python 脚本转换成 C# 的 Emgu。
在 Python 中,代码
COLOR_MIN = np.array([104, 34, 255], np.uint8)
COLOR_MAX = np.array([124, 34, 255], np.uint8)
frame_threshed = cv2.inRange(hsv_img, COLOR_MIN, COLOR_MAX)
cv2.imshow("frame thresh", frame_threshed)
可以正确地对图像进行阈值处理,并通过 cv2.imshow 显示出来。
我把代码转换成 C# 如下:
var min = new Hsv(104, 34, 255);
var max = new Hsv(124, 34, 255);
var thresh = hsvImg.InRange(min, max);
CvInvoke.cvShowImage("thresh", thresh);
但是现在只显示了一张黑色的图像——所以看起来没有任何东西符合阈值。
在这两种情况下,我使用的都是同一个 .PNG 文件作为输入。我是在 OSX 上写的 Python 代码,而 .NET 代码是在一个 Windows 8 虚拟机中运行的——这会不会和颜色配置文件有关呢?
如果有任何建议或者可以尝试的方法,让 .NET 版本正常工作,我会非常感激!!谢谢!
1 个回答
1
看起来我的问题是我在用一个旧版本的emgu,我参考的是2.4版本的文档,按照那个文档上面的内容应该是可以工作的。
在我使用的版本(2.2)中,下面的代码是可以正常工作的:
var min = new Hsv(103, 33, 254);
var max = new Hsv(125, 35, 256);
var thresh = hsvImg.InRange(min, max);
CvInvoke.cvShowImage("thresh", thresh);
这里不是用小于等于(<=)和大于等于(>=)来检查,而是用小于(<)和大于(>)。
这都是我自己的错,误点了NuGet中的错误包……这更让我觉得应该总是使用命令行来操作;)