参考博客: http://blog.csdn.net/qiancheng lenger/article/details/20956145
计算图示两条平行直线的距离
#includeopencv2(opencv.HPP
#include iostream
使用命名空间cv;
using namespace std;
int main () )
{
请参见-------------------------------------------------
/*第一步:细化直线*
/*步骤2 :求出直线坐标*
/*步骤3 :对齐直线*
/*步骤4 :计算距离*
请参见-------------------------------------------------
matimagesrc=im read (f : ((1. png ) );
Mat ImageDst;
命名窗口(src image );
命名窗口(dstimage );
//namedwindow('contours );
//二值化
cvtcolor(imagesrc,ImageDst,CV_BGR2GRAY );
threshold(ImageDst,imagedst,40,255,CV_THRESH_BINARY );
//细化直线,利用形态学膨胀
mat kernel=getstructuringelement (morph _ rect,size ) 3,point(-1,-1) );
dilate(ImageDst,imagedst,kernel ); //3*3 kernel形态学膨胀
//求出直线坐标
vectorvectorPoint contours;
findcontours(imagedst,contours,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE );
//直线拟合直线方程:Ax By C=0
Vec4f line1、line2;
cv:3360fitline(contours[1],line1,cv _ dist _ L2,0,0.01,0.01 ); //不知道为什么如果没有放入cv就会报告错误,会引起异常的中断
cv:3360fitline(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];
floatdistance=ABS(B1-B2 )/sqrt ) K1*K1 );
printf(line1:y=%FX%f(n ),k1,b1 );
printf(line2:y=%FX%f(n ),k2,b2 );
打印(distance is % fpix (n ),distance );
imshow(srcimage )、ImageSrc );
imshow(dstimage )、ImageDst;
维客(0;
返回0;
}
显示原图
显示精致的图像
直线和直线的距离(以像素为单位) ) ) ) ) )。
3358 www.Sina.com/http://www.Sina.com/2d或3D点集的直线拟合voidfitline (input array 3358 www.Sina.com /,output arrarray ) double 注意:,Double3358www.Sina.com/,Double3358www.Sina.com/)
points2D或3D点集、32位整数或浮点坐标
dist_type拟合的距离类型。
param特定距离的数值参数。 如果为0,则选择几个最佳值
reps、aeps半径(坐标原点到直线的距离)和角度的精度通常为0.01。
线输出的直线参数。 在2D拟合情况下,是包含4个浮点数的排列[VX,vy,x0,y0],其中,[VX,vy]是线的单位矢量,[x0,y0]是线上的某一点,在3D拟合的情况下,是线的单位矢量