OpenCV更好地检测红色?

kav*_*kav 22 c++ opencv colors

我有以下图片:

在此输入图像描述

我想使用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 );
Run Code Online (Sandbox Code Playgroud)

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

是否有关于使用最佳值(也许是过滤器)的建议?

Mik*_*iki 44

在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;
}
Run Code Online (Sandbox Code Playgroud)

你以前的结果:

在此输入图像描述

结果添加范围[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;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 只是来自@ fmw42的一个很酷的小技巧我想分享...你可以反转图像并寻找不包装的cyans :-) http://stackoverflow.com/a/43926013/2836621 (2认同)