OpenCV:我如何解释inRange的结果

OpenCV: how can I interpret the results of inRange?

本文关键字:解释 inRange 结果 何解释 OpenCV      更新时间:2023-10-16

>我正在处理视频图像,我想检测视频是否包含一定范围的红色像素。这可能吗?

这是我从教程中改编的代码:

#ifdef __cplusplus
- (void)processImage:(Mat&)image;
{
    cv::Mat orig_image = image.clone();
    cv::medianBlur(image, image, 3);
    cv::Mat hsv_image;
    cv::cvtColor(image, hsv_image, cv::COLOR_BGR2HSV);
    cv::Mat lower_red_hue_range;
    cv::Mat upper_red_hue_range;
    cv::inRange(hsv_image, cv::Scalar(0, 100, 100), cv::Scalar(10, 255, 255), lower_red_hue_range);
    cv::inRange(hsv_image, cv::Scalar(160, 100, 100), cv::Scalar(179, 255, 255), upper_red_hue_range);
    // Interpret values here
}

解释值

我想检测 inRange 操作的结果是否为零。换句话说,我想了解原始图像中是否有任何匹配的像素,其颜色范围与给定的下部和上限红色刻度不同。如何解释结果?

首先,您需要或下部和上部掩码:

Mat mask = lower_red_hue_range | upper_red_hue_range;

然后你可以countNonZero看看是否有非零像素(即你发现了一些东西)。

int number_of_non_zero_pixels = countNonZero(mask);

最好先应用形态侵蚀或开口来去除小的(可能是嘈杂的)斑点:

Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
morphologyEx(mask, mask, MORPH_OPEN, kernel); // or MORPH_ERODE

或找到连接的组件(findContoursconnectedComponentsWithStats)并根据某些条件修剪/搜索:

vector<vector<Point>> contours
findContours(mask.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
double threshold_on_area = 100.0;
for(int i=0; i<contours.size(); ++i)
{
    double area = countourArea(contours[i]);
    if(area < threshold_on_area)
    {
        // don't consider this contour
        continue;
    } 
    else
    {
        // do something (e.g. drawing a bounding box around the contour)
        Rect box = boundingRect(contours[i]);
        rectangle(hsv_image, box, Scalar(0, 255, 255));
    }
}