• OpenCV:直线拟合——cv::fitLine()详解


    实现目的:有一系列的点,需要拟合出一条直线。

    cv::fitLine()的具体调用形式如下:

    void cv::fitLine(  
        cv::InputArray points, // 二维点的数组或vector  
        cv::OutputArray line, // 输出直线,Vec4f (2d)或Vec6f (3d)的vector  
        int distType, // 距离类型  
        double param, // 距离参数  
        double reps, // 径向的精度参数  表示直线到原点距离的精度,建议取 0.01。设为0,则自动选用最优值
        double aeps // 角度精度参数  表示直线角度的精度,建议取 0.01
    ); 

    计算出的直线信息存放在 line 中,为 cv::Vec4f 类型。line[0]、line[1] 存放的是直线的方向向量,double cos_theta = line[0]; double sin_theta = line[1];。line[2]、line[3] 存放的是直线上一个点的坐标。

    还不太理解输出的直线,为什么要用这种类型。可以避免得到竖直直线,斜率无法显示么?

    如果在图中画出直线,会用到cv::line(image, point1, point2, cv::Scalar(0, 255, 0), 2, 8, 0);因此,需要输入直线上的两个点,才能画出直线。

        double cos_theta = line[0];
        double sin_theta = line[1];
        double x0 = line[2], y0 = line[3];
    
        double k = sin_theta / cos_theta;
        double b = y0 - k * x0;
    
        double x = 0;
        double y = k * x + b;
    
        cv::line(image, Point(x0,y0), Point(x,y), cv::Scalar(255), 1);
  • 相关阅读:
    wait/sleep/yield的区别
    54点提高PHP编程效率(转)
    ftp 使用
    转义 html 里特殊含义字符
    查看端口是否被占用
    webservice 获取调用者IP
    字符编码
    你有读过软件的协议或是网站的服务条款吗?
    使用TSQL的Rand函数生成随机数的艰苦历程
    几个.NET方面的问题——参考答案
  • 原文地址:https://www.cnblogs.com/supercxm/p/8483776.html
Copyright © 2020-2023  润新知