计算两条直线之间的距离
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;
}
显示原图
显示细化处理后的图片
直线方程和直线间距离(像素单位)
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) 是线上某点。
计算图示两平行直线的距离
#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) 是线上某点。
相关文章推荐
- nginx安装配置+清缓存模块安装
- Stanford UFLDL教程 自编码算法与稀疏性
- C++ STL
- 再谈继承
- Stanford UFLDL教程 梯度检验与高级优化
- nginx 编译参数详解(运维不得不看)
- Linux下JDK.Eclipse.Tomcat安装
- Windows系统配置Java Web开发环境Step by Step
- java中的集合框架
- nginx安装(1) – ttlsa教程系列之nginx
- codeforces 377B Preparing for the Contest 二分+优先队列
- busybox 显示用户名及路径 -----[\u@\h\W]\# busybox 在制作根文件系统的处理方法
- PIC32MZ tutorial -- Blinky LED
- GPU 加速NLP任务(Theano+CUDA)
- 珍惜别人的幸福
- Swift设置Table View的Cell中Lable自适应内容高度的
- Spark常用RDD操作汇总
- 2013武汉大学操作系统实验
- 南大软院大神养成计划
- Research