Hello StackOverflowers
我创建了一个应用程序,它使用inRange函数根据预定义的颜色对图像进行分段。然后,我在检测到的对象周围绘制边界框。
我的问题是如何确定区域属性,例如:面积,大小,高度和中心点。
这里我放了一个屏幕转储示例.....
我应如何检索这些边界框或任何其他被淹的边界框的区域属性.......?
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(mBlur, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
/// Approximate contours to polygons + get bounding rects and circles
vector<vector<Point> > contours_poly( contours.size() );
vector<Rect> boundRect( contours.size() );
vector<Point2f>center( contours.size() );
vector<float>radius( contours.size() );
for( int i = 0; i < contours.size(); i++ )
{ approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
boundRect[i] = boundingRect( Mat(contours_poly[i]) );
}
/// Draw polygonal contour + bonding rects
Mat drawing = Mat::zeros( range_out.size(), CV_8UC3 );
for( int i = 0; i< contours.size(); i++ )
{
Scalar color = Scalar(255,0,255);
drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
}
问候
答案 0 :(得分:2)
您可以使用内置的OpenCV function获取该区域。还有其他功能可以满足您的所有需求。
答案 1 :(得分:1)
迭代分割形状的2D坐标(图片中的粉红色细线,您可以发现这只是检查哪些像素不是黑色并查看其坐标)并存储找到的最大和最小X和Y.然后,宽度为maxX - minX
,高度为maxY - minY
答案 2 :(得分:0)
void visualizeSegments(Mat& img, Mat& dst)
{
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
dst=Mat::zeros(img.size(), CV_8UC3);
for(int i = 0; i < contours.size(); i++)
{
//Moments mu = moments(contours[i], true );
//Point2f centroid(mu.m10/mu.m00,mu.m01/mu.m00);
//double area = fabs(contourArea(Mat(contours[i])));
//vector<Point> contours_poly;
//approxPolyDP(Mat(contours[i]), contours_poly, 3, true);
//Rect boundRect = boundingRect(Mat(contours_poly));
drawContours(dst, contours, i, Scalar(255,0,0), -1, 8, hierarchy);
}
}
答案 3 :(得分:0)
如上所述,OpenCV中有一组有用的功能 1. double contourArea(InputArray contour,bool oriented = false):计算区域 2. double arcLength(InputArray曲线,bool关闭):计算周长 3.时刻(InputArray数组,bool binaryImage = false):计算重心 4. void HuMoments(const Moments&amp; m,OutputArray hu):如果你想要对分类有用的其他属性