cv::fitLine用法
定义代码示例y = x + 1直线y = -x + 1直线定义
在opencv官方文档定义如下:
void cv::fitLine(InputArray points,OutputArray line,int distType,double param,double reps,double aeps )#include <opencv2/imgproc.hpp>Fits a line to a 2D or 3D point set.ParameterspointsInput vector of 2D or 3D points, stored in std::vector<> or Mat.lineOutput line parameters. In case of 2D fitting, it should be a vector of 4 elements (like Vec4f) - (vx, vy, x0, y0), where (vx, vy) is a normalized vector collinear to the line and (x0, y0) is a point on the line. In case of 3D fitting, it should be a vector of 6 elements (like Vec6f) - (vx, vy, vz, x0, y0, z0), where (vx, vy, vz) is a normalized vector collinear to the line and (x0, y0, z0) is a point on the line.distTypeDistance used by the M-estimator, see DistanceTypesparamNumerical parameter ( C ) for some types of distances. If it is 0, an optimal value is chosen.repsSufficient accuracy for the radius (distance between the coordinate origin and the line).aepsSufficient accuracy for the angle. 0.01 would be a good default value for reps and aeps.
代码示例
简而言之,就是利用已有的点拟合直线,本篇只针对使用做简单示例,基于opencv3.4.5, C++;
主要介绍输出参数,
OutputArray line:在二维下为四个元素,前两个为向量(x, y),后两个为拟合直线上的一个点distType,参考如下:
//! @see distanceTransform, fitLineenum DistanceTypes {DIST_USER = -1, //!< User defined distanceDIST_L1= 1, //!< distance = |x1-x2| + |y1-y2|DIST_L2= 2, //!< the simple euclidean distanceDIST_C = 3, //!< distance = max(|x1-x2|,|y1-y2|)DIST_L12= 4, //!< L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))DIST_FAIR = 5, //!< distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998DIST_WELSCH = 6, //!< distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846DIST_HUBER = 7 //!< distance = |x|<c ? x^2/2 : c(|x|-c/2), c=1.345};
param: 默认0,opencv自动优化reps:0.01精度即可aeps:建议0.01,0.01 would be a good default value…
y = x + 1直线
向量(0.707107,0.707107)如图下
设直线为 y = ax + b, a = 1 , b = 1
则 y = x + 1,部分代码:
std::vector<cv::Point2f> input_pts;input_pts.emplace_back(1, 2);input_pts.emplace_back(2, 3);cv::Vec4f calc_line;cv::fitLine(input_pts, calc_line, cv::DIST_L2, 0, 0.01, 0.01);std::cout << "calc_line[0]=" << calc_line[0]<< "\ncalc_line[0]=" << calc_line[1]<< "\ncalc_line[0]=" << calc_line[2]<< "\ncalc_line[0]=" << calc_line[3] << std::endl;
控制台输出
calc_line[0]=0.707107calc_line[0]=0.707107calc_line[0]=1.5calc_line[0]=2.5
y = -x + 1直线
向量(0.707107,-0.707107)
设直线为 y = ax + b, a = -1 , b = 1
则 y = -x + 1,部分代码:
std::vector<cv::Point2f> input_pts;input_pts.emplace_back(1, 2);input_pts.emplace_back(2, 1);cv::Vec4f calc_line;cv::fitLine(input_pts, calc_line, cv::DIST_L2, 0, 0.01, 0.01);std::cout << "calc_line[0]=" << calc_line[0]<< "\ncalc_line[0]=" << calc_line[1]<< "\ncalc_line[0]=" << calc_line[2]<< "\ncalc_line[0]=" << calc_line[3] << std::endl;
calc_line[0]=0.707107calc_line[0]=-0.707107calc_line[0]=1.5calc_line[0]=1.5
Enjoy~
如果觉得《cv::fitLine用法》对你有帮助,请点赞、收藏,并留下你的观点哦!