您的位置:首页 > 其它

计算两条直线之间的距离

2015-12-05 18:55 441 查看
参考博客:http://blog.csdn.net/qianchenglenger/article/details/20956145

计算图示两平行直线的距离



#include <opencv2\opencv.hpp>

#include <iostream>

using namespace cv;

using namespace std;

int main()

{
//---------------------------------------------------------------------------//
/*第一步:细化直线*/
/*第二步:求直线坐标*/
/*第三步:拟合直线*/
/*第四步:计算距离*/
//---------------------------------------------------------------------------//
Mat ImageSrc = imread("F:\\1.png");
Mat ImageDst;
namedWindow("SrcImage");
namedWindow("DstImage");

// namedWindow("Contours");

//二值化
cvtColor(ImageSrc, ImageDst, CV_BGR2GRAY);
threshold(ImageDst, ImageDst, 40, 255, CV_THRESH_BINARY);

//细化直线,利用形态学膨胀
Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1, -1));
dilate(ImageDst, ImageDst, kernel);//3*3 kernel 形态学膨胀

//求直线坐标
vector<vector<Point>> contours;
findContours(ImageDst,contours,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE);

//直线拟合  直线方程:Ax+By+C = 0
Vec4f line1, line2;
cv::fitLine(contours[1], line1, CV_DIST_L2, 0, 0.01, 0.01);//不知道为什么没加cv会报错,引发异常中断
cv::fitLine(contours[2], line2, CV_DIST_L2, 0, 0.01, 0.01);

cout << "line1: (" << line1[0] << "," << line1[1] << ")(" << line1[2] << "," <<line1[3] << ")\n";
cout << "line2: (" << line2[0] << "," << line2[1] << ")(" << line2[2] << "," <<line2[3] << ")\n";

float k1 = line1[1] / line1[0];
float k2 = line2[1] / line2[0];

float b1 = line1[3] - k1*line1[2];
float b2 = line2[3] - k2*line2[2];

float distance = abs(b1 - b2) / sqrt(k1*k1 + 1);
printf("line1: y=%fx+%f \n", k1, b1);
printf("line2: y=%fx+%f \n", k2, b2);
printf("distance  is %f pix\n", distance);

imshow("SrcImage", ImageSrc);
imshow("DstImage", ImageDst);
waitKey(0);
return 0;

}

显示原图



显示细化处理后的图片



直线方程和直线间距离(像素单位)



注意:

FitLine

2D 或 3D 点集的直线拟合 
void
fitLine(InputArray
points, OutputArray line, int distType, double
param, double reps, double aeps)

points 2D 或 3D 点集,32-比特整数或浮点数坐标 

dist_type 拟合的距离类型 . 

param 对某些距离的数字参数,如果是 0, 则选择某些最优值 

reps, aeps 半径 (坐标原点到直线的距离) 和角度的精度,一般设为0.01。 

line 输出的直线参数。2D 拟合情况下,它是包含 4 个浮点数的数组 (vx, vy, x0, y0),其中
(vx, vy) 是线的单位向量而 (x0, y0) 是线上的某个点. 对 3D 拟合,它是包含 6 个浮点数的数组 (vx, vy, vz, x0, y0, z0), 其中 (vx, vy, vz) 是线的单位向量,而 (x0, y0, z0) 是线上某点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: