Opencv 计算轮廓中像素的有效方法

Opencv 计算轮廓中像素的有效方法,opencv,Opencv,给定一个轮廓,计算轮廓内像素的有效方法是什么 我尝试使用了opencv函数 cv::PointPolyContest() 但该功能效率极低,需要花费大量时间才能获得更大的轮廓。 请告知我想您已经使用findContours()函数提取了轮廓 然后,您可以直接使用轮廓区域() cout << Contour area is << contourArea(contours[k]) ; cout我认为您可以使用一个简单的递归遍历,从单个轮廓点开始填充区域。如果先使用col,它

给定一个轮廓,计算轮廓内像素的有效方法是什么

我尝试使用了opencv函数
cv::PointPolyContest()

但该功能效率极低,需要花费大量时间才能获得更大的轮廓。

请告知

我想您已经使用
findContours()
函数提取了轮廓

然后,您可以直接使用
轮廓区域()

cout << Contour area is << contourArea(contours[k]) ;

cout我认为您可以使用一个简单的递归遍历,从单个轮廓点开始填充区域。如果先使用col,它将非常有效,我认为您可以使用行迭代器


如果您最关心效率,您也许可以将递归展开为循环并执行卸载操作。

如果
contourArea
没有给出预期的结果,您可以采用以下方法:

  • 将轮廓复制到新的空垫中
  • 在新的子矩阵上应用
    countNonZero
    ,您将获得非黑色像素的数量

        //1. Copy the contour in a new empty Mat
        Rect cRect = boundingRect(*it); //it is an iterator for your contours vector
        Mat subImg = dilatedImg(cRect);
        double cArea = countNonZero(subImg);
    

  • 注意:如果没有二值图像,可能需要先设置阈值,然后才能计算正确的像素。

    hi@vasile我正在使用
    cv::findcontours()
    提取轮廓。但是,我还需要位于轮廓内的所有像素的
    xy坐标
    ,并将其存储为
    std::vector
    ,以便稍后使用。这就是为什么我使用
    cv::pointPolyContest()
    。你能建议一个更好的方法吗?嗯,你可以试着用轮廓(比如fillPoly())来制作一个遮罩,使其成为一个空白图像。因此,您将有一个图像,其中像素位于轮廓内,而零的大小过大。从OpenCV中的contourArea文档中,“该函数计算轮廓面积。与矩()类似,该面积使用绿色公式计算。因此,如果使用drawContours()绘制轮廓,则返回的面积和非零像素数或fillPoly()可以不同。此外,对于具有自相交的轮廓,该函数肯定会给出错误的结果。”