OpenCV更好地检测红色?

Posted

技术标签:

【中文标题】OpenCV更好地检测红色?【英文标题】:OpenCV better detection of red color? 【发布时间】:2015-12-07 23:40:52 【问题描述】:

我有以下图片:

我想使用cv::inRange 方法和HSV 颜色空间来检测红色矩形。

int H_MIN = 0;
int H_MAX = 10;
int S_MIN = 70; 
int S_MAX = 255;
int V_MIN = 50;
int V_MAX = 255;

cv::cvtColor( input, imageHSV, cv::COLOR_BGR2HSV );

cv::inRange( imageHSV, cv::Scalar( H_MIN, S_MIN, V_MIN ), cv::Scalar( H_MAX, S_MAX, V_MAX ), imgThreshold0 );

我已经创建了动态轨迹栏以更改 HSV 的值,但我无法获得所需的结果。

对使用最佳值(可能还有过滤器)有什么建议吗?

【问题讨论】:

【参考方案1】:

在 HSV 空间中,红色环绕在 180 左右。因此,您需要 H 值同时位于 [0,10] 和 [170, 180] 中。

试试这个:

#include <opencv2\opencv.hpp>
using namespace cv;

int main()

    Mat3b bgr = imread("path_to_image");

    Mat3b hsv;
    cvtColor(bgr, hsv, COLOR_BGR2HSV);

    Mat1b mask1, mask2;
    inRange(hsv, Scalar(0, 70, 50), Scalar(10, 255, 255), mask1);
    inRange(hsv, Scalar(170, 70, 50), Scalar(180, 255, 255), mask2);

    Mat1b mask = mask1 | mask2;

    imshow("Mask", mask);
    waitKey();

    return 0;

你之前的结果:

结果添加范围[170, 180]:


另一种只需要检查单个范围的有趣方法是:

反转 BGR 图像 转换为 HSV 寻找青色颜色

这个想法由fmw42 提出并由Mark Setchell 指出。非常感谢。

#include <opencv2\opencv.hpp>
using namespace cv;

int main()

    Mat3b bgr = imread("path_to_image");

    Mat3b bgr_inv = ~bgr;
    Mat3b hsv_inv;
    cvtColor(bgr_inv, hsv_inv, COLOR_BGR2HSV);

    Mat1b mask; 
    inRange(hsv_inv, Scalar(90 - 10, 70, 50), Scalar(90 + 10, 255, 255), mask); // Cyan is 90

    imshow("Mask", mask);
    waitKey();

    return 0;

【讨论】:

只是我想分享的来自@fmw42 的一个很酷的小技巧...您可以反转图像并寻找不换行的青色:-) ***.com/a/43926013/2836621 @MarkSetchell 太聪明了!为完整起见,使用 C++ 代码添加到答案中。非常感谢! 您的回复非常有帮助!谢谢@Miki! 你能帮帮我吗?我的 imshow("Mask", mask) 给出了一个错误。 error: (-215) size.width&gt;0 &amp;&amp; size.height&gt;0 in function imshow。据我了解,错误是因为 mask.data == null 。我究竟做错了什么?提前致谢

以上是关于OpenCV更好地检测红色?的主要内容,如果未能解决你的问题,请参考以下文章

opencv-python:为啥检测到不正确的边界框(几个边界框)?

使用 OpenCV 进行图像中的性别预测和年龄检测

OpenCV——基于颜色的物体检测系统

如何使用 CV 正确检测许多小的红色激光点?

opencv 怎么识别出红色物体呀

OpenCV:改变像素的颜色