从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的标量,则红辣椒为白色,背面为黑色(正确检测到)。
来源图片:
我不明白这一切......
答案 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)
原始图片:
结果:
答案 1 :(得分:1)
我现在知道我的问题 就是这样:
Imgproc.cvtColor(SRC,HSV,Imgproc.COLOR_BGR2HSV);
使用RGB2HSV,所有值都是正确的。 我认为在Android智能手机上有BGR用过吗?
但是,非常感谢所有答案。
祝大家一切顺利:)