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