【OpenCV3】直线拟合–FitLine()函数详解

【OpenCV3】直线拟合–FitLine()函数详解一 FitLine 函数原型 CV EXPORTS WvoidfitLine InputArraypo 待输入点集 一般为二维数组或 vector 点集 OutputArrayl 输出点集 一个是方向向量 另一个是拟合直线上的点 Vec4f 2d 或 Vec6f 3d 的 vector intdistType

一、FitLine()函数原型

CV_EXPORTS_W void fitLine(   InputArray points, // 待输入点集(一般为二维数组或vector点集)   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表示的是输入的点到直线的距离。

CV_DIST_USER =-1, /* User defined distance */ CV_DIST_L1 =1, /* distance = |x1-x2| + |y1-y2| */ CV_DIST_L2 =2, /* the simple euclidean distance */ CV_DIST_C =3, /* distance = max(|x1-x2|,|y1-y2|) */ CV_DIST_L12 =4, /* L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1)) */ CV_DIST_FAIR =5, /* distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998 */ CV_DIST_WELSCH =6, /* distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846 */ CV_DIST_HUBER =7 /* distance = |x| 
  
  

第四个参数是距离参数,跟所选的距离类型有关,值可以设置为0,cv::fitLine()函数本身会自动选择最优化的值

第五、六两个参数用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为1e-2。

下面,从一个具体的例子来看cv::Line()实际拟合的效果。

#include 
   
     #include 
    
      #include 
     
       using namespace std; using namespace cv; int main() { //创建一个用于绘制图像的空白图 cv::Mat image = cv::Mat::zeros(480, 640, CV_8UC3); //输入拟合点 std::vector 
      
        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 0; } 
       
      
     
   

参考链接:(1)https://blog.csdn.net/guduruyu/article/details/

     (2)https://blog.csdn.net/_/article/details/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229541.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午4:29
下一篇 2026年3月16日 下午4:29


相关推荐

  • java trylock_lock.tryLock()方法的使用

    java trylock_lock.tryLock()方法的使用packageconcurrent;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassTestTryLock{privateListlist=…

    2022年10月16日
    5
  • ug图改变颜色_unity改变image透明度

    ug图改变颜色_unity改变image透明度UGUI图片将其他颜色去除,显示灰色图片本例适用于UGUI一般项目中会有一些图标,当你拥有该图标显示为彩色图标,一般项目中最占资源的就是图片,不允许添加一张彩色图片,一张灰色图片,必须通过一些方法将彩色图标的颜色去掉,获取图标的灰色值。UGUI自带了一个Shader,Sprites/Default,默认给了一个添加该Shader的材质球 1Shader”U

    2025年11月11日
    7
  • SQL之存储过程详细介绍及语法(转)

    SQL之存储过程详细介绍及语法(转)1:定义存储过程(storedprocedure)是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行。存储过程分为系统存储过程和自定义

    2022年7月2日
    25
  • mysql整型转字符串_java中如何将字符串转换为字符数组

    mysql整型转字符串_java中如何将字符串转换为字符数组cast(字段asunsigned)例如1:把表结构中的name(字符串)字段转化成整型cast(nameasunsigned)应用:将表A记录按name字段从小到大排列select*fromAorderbycast(nameasunsigned); http://xuyemao.blog.163.com/blog/static/24454858…

    2022年8月30日
    14
  • 【elasticsearch系列】windows安装IK分词器插件[通俗易懂]

    【elasticsearch系列】windows安装IK分词器插件[通俗易懂]环境github下载:https://github.com/medcl/elasticsearch-analysis-ik/releases注意,IK分词器插件要与ES版本保持一致;有的小伙伴在GitHub上下载插件时,没有发现与ES相对应的版本,可以切换到Tags中选择分支版本;例如Branchs列表中仅可能存在主版本号;切换到右侧Tags中查找对应的版本即可;小编这里选择的7.8.0的版本;安装IK解压缩后拷贝到ElasticSearch安装目录的plugins文件夹下,默认情况该

    2022年6月18日
    27
  • code blocks使用方法总结「建议收藏」

    code blocks使用方法总结「建议收藏」下载和安装:官网地址:http://www.codeblocks.org/downloadstips:同一个版本有多个安装文件,官网上有对于各个文件的简要介绍。最好选择 mingw-se

    2022年8月4日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号