我正在做的工作是必须找到感兴趣区域(ROI),然后对图像执行阈值操作:

由于我不是计算机 Realm 的人,因此遇到了一些困难。

我开始尝试通过以下代码查找ROI:

// code
string filename = "2011-06-11-09%3A12%3A15.387932.bmp";

Mat img = imread(filename)

if (!img.data)
{
    std::cout << "!!! imread não conseguiu abrir imagem: " << filename << std::endl;
    return -1;
}

cv::Rect roi;
roi.x = 0
roi.y = 90

roi.width = 400;
roi.height = 90;

cv::Mat crop = original_image(roi);
cv::imwrite("2011-06-11-09%3A12%3A15.387932.bmp", crop);

非常感谢你。

最佳答案

我假设您有兴趣隔离图像的数字,并且要手动指定ROI(根据您的书写)。

您可以使用use better coordinates for the ROI and crop that into a new cv::Mat 获得类似于以下输出的内容:

仅当您想隔离数字以稍后进行识别时,才在此图像上执行阈值才有意义。 cv::inRange() 提供了一种很好的方法来执行此操作,它对所有通道(RGB图像== 3个通道)执行阈值运算。

注意:cv::Mat以BGR顺序存储像素,当您指定阈值时要记住这一点很重要。

作为一个简单的测试,您可以从B:70 G:90 R:100到B:140 G:140 R:140 执行阈值以得到以下输出:

不错!我对您的代码做了一些更改,以得到以下结果:

#include <cv.h>
#include <highgui.h>
#include <iostream>

int main()
{
    cv::Mat image = cv::imread("input.jpg");
    if (!image.data)
    {
        std::cout << "!!! imread failed to load image" << std::endl;
        return -1;
    }

    cv::Rect roi;
    roi.x = 165;
    roi.y = 50;
    roi.width = 440;
    roi.height = 80;

    /* Crop the original image to the defined ROI */

    cv::Mat crop = image(roi);
    cv::imwrite("colors_roi.png", crop);

    /* Threshold the ROI based on a BGR color range to isolate yellow-ish colors */

    cv::Mat dest;
    cv::inRange(crop, cv::Scalar(70, 90, 100), cv::Scalar(140, 140, 140), dest);
    cv::imwrite("colors_threshold.png", dest);

    cv::imshow("Example", dest);
    cv::waitKey();

    return 0;
}

关于c++ - 使用openCV检测ROI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15899799/

10-13 03:34