为什么我使用颜色检测(OpenCV)获取错误的值

时间:2016-10-27 12:21:05

标签: android opencv

从BGR到HSV的转换存在问题。 我使用Android Studio编程并使用我的Xperia Z5进行测试。

在我的代码段中,我得到了完全错误的颜色值:

Scalar LOWER_RED  = (0,0,0);
Scalar HIGHER_RED = (30,255,255);

Mat src = new Mat(Bitmap.getHeight(), Bitmap.getWidth(),CvType.CV_8UC4);
Mat hsv = new Mat(Bitmap.getHeight(), Bitmap.getWidth(),CvType.CV_8UC4);

Utils bitmapToMat(Bitmap, src);

Imgproc.cvtColor(src,hsv,Imgproc.COLOR_BGR2HSV);

Core.inRange(hsv, LOWER_RED, HIGHER_RED, hsv);

Utils.matToBitmap(hsv,Bitmap);

我想拍摄红色。我做错了什么?

编辑: 我尝试了所有的建议,我的代码片段现在看起来像这样:

Scalar LOWER_RED  = (0,10,100);
Scalar HIGHER_RED = (10,255,255);

Mat src = new Mat(Bitmap.getHeight(), Bitmap.getWidth(),CvType.CV_8UC3);
Mat hsv = new Mat(Bitmap.getHeight(), Bitmap.getWidth(),CvType.CV_8UC3);

Utils bitmapToMat(Bitmap, src);

Imgproc.cvtColor(src,hsv,Imgproc.COLOR_BGR2HSV);

Core.inRange(hsv, LOWER_RED, HIGHER_RED, hsv);

Utils.matToBitmap(hsv,Bitmap);

结果是黑屏(没有匹配)

Core.inRange(hsv,New Scalar(0,0,0),New Scalar(10,255,255),HighRedRange);
Core.inRange(hsv,New Scalar(160,100,100),New Scalar(179,255,255),LowRedRange);
Core.addWeighted(LowRedRange,1.0,HighredRange,1.0,0.0,hsv);

蔬菜是黑色的,hsv中的白色背景是白色的 0,0,0 - 10,255,255 AND 160,100,100 - 179,255,255

如果我使用从110,100,100到135,255,255的标量,则红辣椒为白色,背面为黑色(正确检测到)。

来源图片:

enter image description here

我不明白这一切......

2 个答案:

答案 0 :(得分:2)

有一个很好的教程here。它适用于C ++,但总体思路是一样的。我尝试了一般的想法,它肯定有效。问题是你的范围太广了。在OpenCV中,Hue范围为0-180。意味着您的上限为30 * 2 = 60,其中包括几乎所有黄色范围。

我为Hue设置范围从0到10,但是请记住,您可能还希望获得160 - 179范围,其中还包括部分红色。为此,您只需要第二个蒙版,然后将它们与简单的添加结合起来。

Python中的示例代码:

import cv2

import numpy as np

img = cv2.imread('peppers.jpg',1)

im_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

thresh_low = np.array([0,100,100])
thresh_high = np.array([10,255,255]) 

mask = cv2.inRange(im_hsv, thresh_low, thresh_high)

im_masked = cv2.bitwise_and(img,img, mask= mask)

cv2.imshow('Masked',im_masked)

cv2.waitKey(0) 

原始图片:

enter image description here

结果:

enter image description here

答案 1 :(得分:1)

我现在知道我的问题 就是这样:

Imgproc.cvtColor(SRC,HSV,Imgproc.COLOR_BGR2HSV);

使用RGB2HSV,所有值都是正确的。 我认为在Android智能手机上有BGR用过吗?

但是,非常感谢所有答案。

祝大家一切顺利:)