本文的主要参考为官方文档OpenCV249-fitLine和博客-OpenCV 学习(直线拟合)

以及《Learning OpenCV 3》page425-426

OpenCV中提供的直线拟合API如下:

void fitLine(InputArray points, OutputArray line, int distType, double param, double reps, double aeps)

输入:二维点集。存储在std::vector<> or Mat

算法:OpenCV中共提供了6种直线拟合的算法,如下图所示,其中第一种就是最常用的最小二乘法。但是最小二乘法受噪声的影响很大,别的方法具有一定的抗干扰性,但是具体的数学原理不是很理解。

输出:拟合结果为一个四元素的容器,比如Vec4f - (vx, vy, x0, y0)。其中(vx, vy) 是直线的方向向量,(x0, y0) 是直线上的一个点。

示例代码如下:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;int main( )
{const char* filename = "1.bmp";Mat src_image = imread(filename,1);if( src_image.empty() ){cout << "Couldn't open image!" << filename;return 0;}int img_width = src_image.cols;int img_height = src_image.rows;Mat gray_image,bool_image;cvtColor(src_image,gray_image,CV_RGB2GRAY);threshold(gray_image,bool_image,0,255,CV_THRESH_OTSU);imshow("二值图", bool_image);//获取二维点集vector<Point> point_set;Point point_temp;for( int i = 0; i < img_height; ++i){for( int j = 0; j < img_width; ++j ){if (bool_image.at<unsigned char>(i,j) < 255){point_temp.x = j;point_temp.y = i;point_set.push_back(point_temp);  }}}//直线拟合   //拟合结果为一个四元素的容器,比如Vec4f - (vx, vy, x0, y0)//其中(vx, vy) 是直线的方向向量//(x0, y0) 是直线上的一个点Vec4f fitline;//拟合方法采用最小二乘法fitLine(point_set,fitline,CV_DIST_L2,0,0.01,0.01);//求出直线上的两个点double k_line = fitline[1]/fitline[0];Point p1(0,k_line*(0 - fitline[2]) + fitline[3]);Point p2(img_width - 1,k_line*(img_width - 1 - fitline[2]) + fitline[3]);//显示拟合出的直线方程char text_equation[1024];sprintf(text_equation,"y-%.2f=%.2f(x-%.2f)",fitline[3],k_line,fitline[2]);putText(src_image,text_equation,Point(30,50),CV_FONT_HERSHEY_COMPLEX,0.5,Scalar(0,0,255),1,8);//显示拟合出的直线line(src_image,p1,p2,Scalar(0,0,255),2); imshow("原图+拟合结果", src_image);waitKey();return 0;
}

OpenCV—直线拟合fitLine相关推荐

  1. OpenCV | 直线拟合fitline函数(Python)

    简介 之前做直线拟合时,自己写了一个利用最小二乘做直线拟合的程序,但是由于直线检测的误差比较大,拟合的效果并不好.个人不知道是什么原因,因此想尝试更改一下直线拟合的算法,后来找到了OpenCV中的fi ...

  2. OpenCV | 直线拟合fitline函数

    学习目标: 学习掌握OpenCV的fitline函数 学习内容: cv::fitLine()的具体调用形式如下: void cv::fitLine( cv::InputArray points, // ...

  3. OpenCV 直线拟合及应用

    直线拟合顾名思义就是根据多个有限个数的点确定一条直线.依据为: 其中为第i个点到直线的距离,p(d)则为确定最小值的函数.而不同的p(d)对应着不同的直线拟合方法: OpenCV提供了7种(-1为用户 ...

  4. OpenCV直线拟合检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 OpenCV直线拟合检测 霍夫直线检测 ...

  5. opencv直线拟合cv::fitLine()

    通过2D或者2D点集拟合直线 void fitLine( InputArray points, OutputArray line, int distType,double param, double ...

  6. OpenCV——直线拟合

    相比于直线检测,直线拟合的最大特点是将所有数据只拟合出一条直线 void fitLine( InputArray points, OutputArray line, int distType,doub ...

  7. opencv 直线拟合

    一.话说直线拟合 霍夫直线检测容易受到线段形状与噪声的干扰而失真,这个时候我们需要另辟蹊径,通过对图像进行二值分析,提取骨架,对骨架像素点拟合生成直线,这种做法在一些场景下非常有效,而且效果还比较好. ...

  8. [OpenCV]直线拟合

    OpenCV实现了直线的拟合. CV_IMPL void cvFitLine( const CvArr* array, int dist, double param,double reps, doub ...

  9. 【OpenCV3】直线拟合--FitLine()函数详解

    一.FitLine()函数原型 CV_EXPORTS_W void fitLine( InputArray points, // 待输入点集(一般为二维数组或vector点集)OutputArray ...

最新文章

  1. HashSet中的add()方法( 零 )(详尽版)
  2. PHP魔术方法__call()篇
  3. 测试工作中常用的方法
  4. sql显示前10行数据_SPL 简化 SQL 案例详解:计算各组前 N 行
  5. 深度学习02——Softmax、DNN、WideDeep Model
  6. HelloWorld讲解
  7. 一、K3 WISE 实施顾问教程《进度1-谈谈实施顾问》
  8. 请问android如何录制acc格式音频
  9. 无pygame写一个python贪吃蛇
  10. uni-app 无网络图标不显示问题解决
  11. 大脑构造图与功能解析_大脑的结构和功能分区_详解人脑构造与功能
  12. 【时间之外】做产品必须知道的SKU是什么?
  13. 单机版Fate安装教程(含虚拟机搭建)
  14. Linux关闭防火墙、设置开放端口
  15. some words from website
  16. 在提示框中:双击浏览器缩放,浓咖啡小睡和Android引导屏幕
  17. Adlik Deer版本发布,模型推理加速就靠它啦
  18. 安装canon pixma ip1000驱动
  19. 讯飞AIUI+唤醒,导致唤醒监听报错10108
  20. 3D建模软件快捷键操作:3DMAX篇(第三期)

热门文章

  1. 哥大计算机专业 世界排名,2020年哥伦比亚大学计算机系统排名
  2. java double 排序_转载:qsort细节用法,double型的排序我竟然一直用错了~~~
  3. 常用字符,点,叉、、、
  4. YTU 3921 游戏
  5. c.n.discovery.InstanceInfoReplicator : There was a problem with the instance info replicator
  6. 如何用html5绘制圆形图片,javascript – 如何使用html5画布绘制连续的圆形图案
  7. 从输入URL到页面加载…
  8. Centos系统下搭建Smokeping 方法
  9. CODJ 1070 秋实大哥打游戏 并查集
  10. 刷题体验第一天——《录鼎记》第一章