+-
Android OpenCV颜色检测
目前我正在开发一款可以检测彩色圆圈的应用.我试图通过遵循 this教程来做到这一点,其中man用Python检测图像上的红色圆圈.我编写了相同的代码,仅用于Java.

                    Mat mat = new Mat(bitmap.getWidth(), bitmap.getHeight(),
                            CvType.CV_8UC3);

                    Mat hsv_image = new Mat();
                    Utils.bitmapToMat(bitmap, mat);
                    Imgproc.cvtColor(mat, hsv_image, Imgproc.COLOR_BGR2HSV);

                    Mat lower_red_hue_range = new Mat();
                    Mat upper_red_hue_range = new Mat();

                    Core.inRange(hsv_image, new Scalar(0, 100, 100), new Scalar(10, 255, 255), lower_red_hue_range);
                    Core.inRange(hsv_image, new Scalar(160, 100, 100), new Scalar(179, 255, 255), upper_red_hue_range);
                    Utils.matToBitmap(hsv_image, bitmap);
                mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
                image.setImageBitmap(mutableBitmap);

我使用的图像与教程中的图像相同:

这是应用BGR2HSV的图像:

当我使用较低的红色色调范围执行代码时,它会检测到蓝色圆圈.当我使用上部红色色调范围时,它会给我黑色bmp(没有检测到任何东西).怎么可能?我究竟做错了什么?这实际上是从python复制到Java.为什么结果不同呢?
提前致谢.

最佳答案
您的垫子是CvType.CV_8UC1图像,即您正在处理灰度图像.尝试使用CvType.CV_8UC3

Mat mat = new Mat(bitmap.getWidth(), bitmap.getHeight(), CvType.CV_8UC3);

hsv_image应如下所示:

如何选择自定义范围:

您可能想要检测绿色圆圈.
那么,在HSV中,范围是:

H in [0,360]
S,V in [0,100]

但是,对于CV_8UC3图像,每个分量H,S,V最多只能由256个值表示,因为它存储在1个字节中.因此,在OpenCV中,CV_8UC3的范围H,S,V是:

H in [0,180] <- halved to fit in the range
S,V in [0,255] <- stretched to fit the range

因此,要从典型范围切换到OpenCV范围,您需要:

opencv_H = typical_H / 2;
opencv_S = typical_S * 2.55; 
opencv_V = typical_V * 2.55;

因此,绿色在120的色调值附近.色调可以在区间[0,360]中具有值.
然而,对于Mat3b HSV图像,H的范围是[0,180],即减半,因此它可以适合具有最多256个可能值的8位表示.
所以,你希望H值大约为120/2 = 60,比如从50到70.
您还可以将S,V的最小值设置为100,以防止非常暗(几乎是黑色)的颜色.

Mat green_hue_range
inRange(hsv_image, cv::Scalar(50, 100, 100), cv::Scalar(70, 255, 255), green_hue_range);
点击查看更多相关文章

转载注明原文:Android OpenCV颜色检测 - 乐贴网