作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
目录
这次只讲思路,集成的话非常简单
一个前提:
两个外接矩形是平行的
过程:
第一步找到两个目标的最小矩形,以其中一个矩形的左边界为基准线(也就是取到最小外接矩形的左上角点1和左下角点2的连接线作为基准线),另外一个目标的左边缘线上随便取一点,我们这里取左上角点3。
获取最小外接矩形是先通过 findContours()找到轮廓,定位到具体目标轮廓后:
Point2f base_vtx[4];
RotatedRect base_box = cv::minAreaRect(base_contours[0]);
base_box.points(base_vtx); // 蓝色最小外接矩形的四个角
circle(img, base_vtx[0], 2, Scalar(0, 0, 255), 2); //用小圆标记点1
circle(img, base_vtx[3], 2, Scalar(0, 0, 255), 2); //用小圆标记点2
Point2f vtx[4];
RotatedRect box = cv::minAreaRect(contours[0]);
box.points(vtx); // 红色最小外接矩形的四个角
circle(img, vtx[0], 2, Scalar(0, 0, 255), 2); //用小圆标记点3
第二步 利用创建点线距离自定义函数计算距离
//定义点线距离的函数
double getDistance(Point2f point1, Point2f point2, Point2f point3)
{
//建立直线方程Ax+By+C=0-->(y2-y1)*x+(x1-x2)*y+(x2*y1-x1*y2)=0
double A = point2.y - point1.y;
double B = point1.x - point2.x;
double C = point2.x * point1.y - point1.x * point2.y;
double a = A * A;
double b = B * B;
//直线距离公式D=|A*x3+B*y3+C|/sqrt(A^2+B^2)
double w = (A * point3.x + B * point3.y + C);
if (w < 0) w = 0 - w;//取绝对值
return double(w / sqrt(a + b));
}
// point1, point2, point3分别对应点1、点2、点3,也就是上边的base_vtx[0]、base_vtx[3]、vtx[0]
double distance = getDistance(point1, point2, point3);
cout << "距离为:" << distance << endl;
【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】