【4Opencv】如何识别出轮廓准确的长和宽
- 作者: 五速梦信息网
- 时间: 2026年04月04日 13:56
cv::RotatedRect cv::minAreaRect( InputArray _points )
{
CV_INSTRUMENT_REGION()
Mat hull;
Point2f out[3];
RotatedRect box;
convexHull(_points, hull, true, true);
if( hull.depth() != CV_32F )
{
Mat temp;
hull.convertTo(temp, CV_32F);
hull = temp;
}
int n = hull.checkVector(2);
const Point2f* hpoints = hull.ptr<Point2f>();
if( n > 2 )
{
rotatingCalipers( hpoints, n, CALIPERS_MINAREARECT, (float*)out );
box.center.x = out[0].x + (out[1].x + out[2].x)*0.5f;
box.center.y = out[0].y + (out[1].y + out[2].y)*0.5f;
box.size.width = (float)std::sqrt((double)out[1].x*out[1].x + (double)out[1].y*out[1].y);
box.size.height = (float)std::sqrt((double)out[2].x*out[2].x + (double)out[2].y*out[2].y);
box.angle = (float)atan2( (double)out[1].y, (double)out[1].x );
}
else if( n == 2 )
{
box.center.x = (hpoints[0].x + hpoints[1].x)*0.5f;
box.center.y = (hpoints[0].y + hpoints[1].y)*0.5f;
double dx = hpoints[1].x - hpoints[0].x;
double dy = hpoints[1].y - hpoints[0].y;
box.size.width = (float)std::sqrt(dx*dx + dy*dy);
box.size.height = 0;
box.angle = (float)atan2( dy, dx );
}
else
{
if( n == 1 )
box.center = hpoints[0];
}
box.angle = (float)(box.angle*180/CV_PI);
return box;
}
相关文章
-
【a202】&&【9208】输油管道问题
【a202】&&【9208】输油管道问题
- 互联网
- 2026年04月04日
-
【adb真机查Log】Android Studio 3.X 找不到Android Device Monitor
【adb真机查Log】Android Studio 3.X 找不到Android Device Monitor
- 互联网
- 2026年04月04日
-
【Android】开发中个人遇到和使用过的值得分享的资源合集
【Android】开发中个人遇到和使用过的值得分享的资源合集
- 互联网
- 2026年04月04日
-
【.net 深呼吸】细说CodeDom(8):分支与循环
【.net 深呼吸】细说CodeDom(8):分支与循环
- 互联网
- 2026年04月04日
-
【.net 深呼吸】细说CodeDom(6):方法参数
【.net 深呼吸】细说CodeDom(6):方法参数
- 互联网
- 2026年04月04日
-
【.net 深呼吸】设置序列化中的最大数据量
【.net 深呼吸】设置序列化中的最大数据量
- 互联网
- 2026年04月04日






