在 OpenCV 中计算 ROI 内的对象区域

Calculate object area inside ROI in OpenCV

我想计算实际 ROI 内检测到的对象(我使用的那个蓝色标记)的面积。我的意思是那两个矩形之一是我在阈值图像(黑白)中的感兴趣区域。

如何计算对象的面积(我认为 - "recognized" 像素簇的总和,它们是白色)在 ROI 内?

我只想考虑具体 ROI 内的那些像素(在下面的示例中 - 左侧)。所以左边ROI以外的所有像素都不会被计算。

ROI 是这样创建的:

rectangle( imgOriginal, Point( 20, 100 ), Point( 170, 250), Scalar( 0, 0, 255 ), +5, 4 );
rectangle( imgThresholded, Point( 20, 100 ), Point( 170, 250), Scalar( 255, 255, 255 ), +5, 4 );
rectangle( imgOriginal, Point( 450, 100 ), Point( 600, 250), Scalar( 0, 0, 255 ), +5, 4 );
rectangle( imgThresholded, Point( 450, 100 ), Point( 600, 250), Scalar( 255, 255, 255 ), +5, 4 );

所以从技术上讲,您根据一些颜色过滤找到了 "largest contour",在它周围画了一个矩形,现在尝试获取它的面积。为了得到它的面积,OpenCv 为你提供了函数(它是如何找到它最大的?)所以这里是函数:double cv::contourArea(InputArray contour)

Here 是主页,因为我认为您可以按原样发送轮廓,但我不确定,但请检查这个基本示例并:

vector<Point> contour;
contour.push_back(Point2f(0, 0)); // push whatever points you want
contour.push_back(Point2f(10, 0));
contour.push_back(Point2f(10, 10));
contour.push_back(Point2f(5, 4));
double area0 = contourArea(contour); // retrieve the area

vector<Point> approx;
approxPolyDP(contour, approx, 5, true);
double area1 = contourArea(approx);
cout << "area0 =" << area0 << endl <<
        "area1 =" << area1 << endl <<
        "approx poly vertices" << approx.size() << endl;

对于二值图像上的特定 ROI,扫描像素值并计算白色 (255)。如果您有更多的 ROI,并且想避免那些不包含白色像素的 ROI,那么只需跳过那些不包含任何白色像素的...

您可以使用cv::countNonZero函数来计算imgThresholded图像中ROI内的非零像素。这正是您所需要的。

cv::Rect leftROI(cv::Point(20, 100), cv::Point(170, 250));
int leftArea = cv::countNonZero(imgThresholded(leftROI));