码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-08-30 18:47:00      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:获取   stat   using   new   线段   bsp   距离   相对   nbsp   

 

#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]直线拟合函数支持类

标签:获取   stat   using   new   线段   bsp   距离   相对   nbsp   

原文地址:https://www.cnblogs.com/lx17746071609/p/11436255.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!