OpenCV实现直线拟合
相比于直线检测,直线拟合的最大特点是将所有数据只拟合出一条直线
文章图片
void fitLine( InputArray points, OutputArray line, int distType,double param, double reps, double aeps );
- points:输入待拟合直线的2D或者3D点集。
- line:输出描述直线的参数,2D点集描述参数为Vec4f类型,3D点集描述参数为Vec6f类型。
- distType:M-estimator算法使用的距离类型标志,可以选择的距离类型在表7-1中给出。
- param:某些类型距离的数值参数(C)。如果数值为0,则自动选择最佳值。
- reps:坐标原点与直线之间的距离精度,数值0表示选择自适应参数,一般常选择0.01。
- aeps:直线角度精度,数值0表示选择自适应参数,一般常选择0.01。
文章图片
如果输入参数是3D点集,输出量为Vec6f类型的(vx vy vz x0 y0 z0),其中(vx vy vz)是与直线共线的归一化向量,(x0 y0 z0)是拟合直线上的随意一点。函数第三个参数是M-estimator算法使用的距离类型标志,可以选择的距离类型在表中给出。函数第四个参数是某些距离类型中的数值参数C,如果数值0表示选择最佳值。函数第五个参数表示坐标原点与拟合直线之间的距离精度,数值0表示选择自适应参数;函数第六个参数表示拟合直线的角度精度,数值0表示选择自适应参数。第五个参数和第六个参数一般取值0.01。
文章图片
简单示例
//// Created by smallflyfly on 2021/6/22.// #include "opencv2/opencv.hpp"#includeusing namespace std; using namespace cv; int main() {Vec4f lines; vector points; const static float pts[20][2] = {{0.0f,0.0f},{10.0f,11.0f},{21.0f,20.0f},{30.0f,30.0f},{40.0f,42.0f},{50.0f,50.0f},{60.0f,60.0f},{70.0f,70.0f},{80.0f,80.0f},{90.0f,92.0f},{100.0f,100.0f},{110.0f,110.0f},{120.f,120.0f},{136.0f,130.0f},{138.0f,140.0f},{150.0f,150.0f},{160.0f,163.0f},{175.0f,170.0f},{181.0f,180.0f},{200.0f,190.0f}}; for (int i = 0; i < 20; ++i) {points.emplace_back(pts[i][0], pts[i][1]); }double param = 0.0; double reps = 0.01; double aeps = 0.01; fitLine(points, lines, DIST_L1, param, reps, aeps); cout << lines << endl; return 0; }
【OpenCV实现直线拟合】以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Java|Java OpenCV图像处理之SIFT角点检测详解
- Node.js中readline模块实现终端输入
- java中如何实现重建二叉树
- 人脸识别|【人脸识别系列】| 实现自动化妆
- paddle|动手从头实现LSTM