【OpenCV3】直线拟合——cv::fitLine()详解
2017-04-07 09:56
429 查看
在图像处理中,通常会遇到根据给定的点集(比如轮廓)拟合出一条直线的情形。opencv2和opencv3中提供了一个专门用于直线拟合的函数——cv::fitLine()。
下面对该函数作一详细的介绍。
cv::fitLine()的具体调用形式如下:
第一个参数是用于拟合直线的输入点集,可以是二维点的cv::Mat数组,也可以是二维点的STL vector。
第二个参数是输出的直线,对于二维直线而言类型为cv::Vec4f,对于三维直线类型则是cv::Vec6f,输出参数的前半部分给出的是直线的方向,而后半部分给出的是直线上的一点(即通常所说的点斜式直线)。
第三个参数是距离类型,拟合直线时,要使输入点到拟合直线的距离和最小化(即下面公式中的cost最小化),可供选的距离类型如下表所示,ri表示的是输入的点到直线的距离。
第四个参数是距离参数,跟所选的距离类型有关,值可以设置为0,cv::fitLine()函数本身会自动选择最优化的值
第五、六两个参数用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为1e-2。
下面,从一个具体的例子来看cv::Line()实际拟合的效果。
示例代码如下:
拟合结果如下:
2017.04.07
下面对该函数作一详细的介绍。
cv::fitLine()的具体调用形式如下:
void cv::fitLine( cv::InputArray points, // 二维点的数组或vector cv::OutputArray line, // 输出直线,Vec4f (2d)或Vec6f (3d)的vector int distType, // 距离类型 double param, // 距离参数 double reps, // 径向的精度参数 double aeps // 角度精度参数 );
第一个参数是用于拟合直线的输入点集,可以是二维点的cv::Mat数组,也可以是二维点的STL vector。
第二个参数是输出的直线,对于二维直线而言类型为cv::Vec4f,对于三维直线类型则是cv::Vec6f,输出参数的前半部分给出的是直线的方向,而后半部分给出的是直线上的一点(即通常所说的点斜式直线)。
第三个参数是距离类型,拟合直线时,要使输入点到拟合直线的距离和最小化(即下面公式中的cost最小化),可供选的距离类型如下表所示,ri表示的是输入的点到直线的距离。
第四个参数是距离参数,跟所选的距离类型有关,值可以设置为0,cv::fitLine()函数本身会自动选择最优化的值
第五、六两个参数用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为1e-2。
下面,从一个具体的例子来看cv::Line()实际拟合的效果。
示例代码如下:
//创建一个用于绘制图像的空白图 cv::Mat image = cv::Mat::zeros(480, 640, CV_8UC3); //输入拟合点 std::vector<cv::Point> points; points.push_back(cv::Point(48, 58)); points.push_back(cv::Point(105, 98)); points.push_back(cv::Point(155, 160)); points.push_back(cv::Point(212, 220)); points.push_back(cv::Point(248, 260)); points.push_back(cv::Point(320, 300)); points.push_back(cv::Point(350, 360)); points.push_back(cv::Point(412, 400)); //将拟合点绘制到空白图上 for (int i = 0; i < points.size(); i++) { cv::circle(image, points[i], 5, cv::Scalar(0, 0, 255), 2, 8, 0); } cv::Vec4f line_para; cv::fitLine(points, line_para, cv::DIST_L2, 0, 1e-2, 1e-2); std::cout << "line_para = " << line_para << std::endl; //获取点斜式的点和斜率 cv::Point point0; point0.x = line_para[2]; point0.y = line_para[3]; double k = line_para[1] / line_para[0]; //计算直线的端点(y = k(x - x0) + y0) cv::Point point1, point2; point1.x = 0; point1.y = k * (0 - point0.x) + point0.y; point2.x = 640; point2.y = k * (640 - point0.x) + point0.y; cv::line(image, point1, point2, cv::Scalar(0, 255, 0), 2, 8, 0); cv::imshow("image", image); cv::waitKey(0); return;
拟合结果如下:
2017.04.07
相关文章推荐
- (原)opencv直线拟合fitLine
- opencv之fitline直线拟合
- OpenCV_(Fit Line with points)用直线拟合一组点
- OpenCV—直线拟合fitLine
- FitLine+直线拟合+C++
- 【python图像处理】直线和曲线的拟合与绘制(curve_fit()详解)
- 【OpenCV】cvFindContours参数详解
- OpenCV 直线拟合
- OpenCv学习笔记(二)--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解
- LSD快速直线检测的原理概要及OpenCV代码实现(CV类LineSegmentDetector)
- 最小二乘法拟合直线 C++/OpenCV
- Python下opencv使用笔记(十一)(详解hough变换检测直线与圆)
- OpenCV 学习(直线拟合)
- OpenCV 学习(直线拟合)
- 《OpenCV》Part6 OpenCV3.1.0 用直线拟合图像中的物体
- 曲线拟合的最小二乘法(基于OpenCV实现)的,拟合图像中离散点的拟合直线
- OpenCV2马拉松第25圈——直线拟合与RANSAC算法
- opencv中的直线拟合函数 cvFitLine
- opencv直线拟合
- OpenCV中文网站例程——直线拟合cvFitline