[opencv]直线拟合函数支持类

Posted lx17746071609

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[opencv]直线拟合函数支持类相关的知识,希望对你有一定的参考价值。

 

#include "LinearFit.h"

//-----------------------直线拟合函数(点集)-------------------------

//-----------------------直线拟合函数(直线组)-------------------------
/**
* [1]
* 说明:获取最终筛选出的的直线中最长的一条
* @param lines 筛选出的直线集合
* @return line 筛选出来最长的直线
*/
Vec4f LinearFit::LinesGetLongestLine(vector<Vec4f> lines) 
    // 初始值
    Vec4f line;
    float dd = 0.0;
    for(Vec4f &v: lines)
        Point2f nodei1, nodei2;
        nodei1.x = v[0];
        nodei1.y = v[1];
        nodei2.x = v[2];
        nodei2.y = v[3];
        float di = PlaneGeometry::NodeDistance(nodei1, nodei2);
        if(di > dd)
            dd = di;
            line = v;
        
    
    return line;


/**
* [2]多条直线的拟合算法
* 说明:多条直线的拟合算法
* @param line
* @return k 斜率
*/
vector<Vec4f> LinearFit::LinesDeduplication(vector<Vec4f> lines, int side) 
    vector<Vec4f> n_lines;
    //  计算两条线段的最短距离 去重
    //  可以通过距离判断和直线相对角度来判断并把重合线段筛选为一条,选择最长的线段。
    for (int l=0; l< lines.size(); l++) 
        Vec4f line = lines[l];
        int addresult = 1;
        for (int nl=0; nl< n_lines.size(); nl++) 
            Vec4f n_line = n_lines[nl];
            // 取线段中点
            Point2f midnode;
            midnode.x = (n_line[0] + n_line[2]) / 2;
            midnode.y = (n_line[1] + n_line[3]) / 2;
            // 算距离垂足
            tuple<double, Point2f> disnode = PlaneGeometry::NodeLineDistance(midnode, line);
            double dis = get<0>(disnode);
            // 新线段长度
            float newline_distance = pow((line[0] - line[2]), 2) + pow((line[1] - line[3]), 2);
            // 旧线段长度
            float nowline_distance = pow((n_line[0] - n_line[2]), 2) + pow((n_line[1] - n_line[3]), 2);
            if (dis < side) 
                if (newline_distance < nowline_distance) 
                    // 舍弃新线段
                    addresult = 0;
                 else 
                    // 舍弃旧线段
                    n_lines = TempHelper::removeObj(n_lines, n_line);
                
            
        
        if (addresult == 1) 
            // 添加新线段
            n_lines.emplace_back((line));
        

    
    return n_lines;

 

#include <cmath>
#include "../../globals.h"
#include "../math/PlaneGeometry.h"

using namespace std;
using namespace cv;


class LinearFit 
public:

    //-----------------------直线拟合函数(点集)-------------------------

    //-----------------------直线拟合函数(直线组)-------------------------
    /**
    * [1]
    * 说明:获取最终筛选出的的直线中最长的一条
    * @param line
    * @return k 斜率
    */
    static Vec4f LinesGetLongestLine(vector<Vec4f> lines);

    /**
    * [2]多条直线的拟合算法
    * 说明:多条直线的拟合算法
    * @param line
    * @return k 斜率
    */
    static vector<Vec4f> LinesDeduplication(vector<Vec4f> lines, int side);


;

 

以上是关于[opencv]直线拟合函数支持类的主要内容,如果未能解决你的问题,请参考以下文章

C++ OpenCV透视变换改进---直线拟合的应用

OpenCV实战——拟合直线

opencv直线拟合cv::fitLine()

opencv利用hough概率变换拟合得到直线后,利用DDA算法得到直线上的像素点坐标

OpenCV求最小外接圆最小外接矩形椭圆拟合直线拟合

用RANSAC算法实现干扰严重的直线拟合~