OpenCV—直线拟合fitLine
本文的主要参考为官方文档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相关推荐
- OpenCV | 直线拟合fitline函数(Python)
简介 之前做直线拟合时,自己写了一个利用最小二乘做直线拟合的程序,但是由于直线检测的误差比较大,拟合的效果并不好.个人不知道是什么原因,因此想尝试更改一下直线拟合的算法,后来找到了OpenCV中的fi ...
- OpenCV | 直线拟合fitline函数
学习目标: 学习掌握OpenCV的fitline函数 学习内容: cv::fitLine()的具体调用形式如下: void cv::fitLine( cv::InputArray points, // ...
- OpenCV 直线拟合及应用
直线拟合顾名思义就是根据多个有限个数的点确定一条直线.依据为: 其中为第i个点到直线的距离,p(d)则为确定最小值的函数.而不同的p(d)对应着不同的直线拟合方法: OpenCV提供了7种(-1为用户 ...
- OpenCV直线拟合检测
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 OpenCV直线拟合检测 霍夫直线检测 ...
- opencv直线拟合cv::fitLine()
通过2D或者2D点集拟合直线 void fitLine( InputArray points, OutputArray line, int distType,double param, double ...
- OpenCV——直线拟合
相比于直线检测,直线拟合的最大特点是将所有数据只拟合出一条直线 void fitLine( InputArray points, OutputArray line, int distType,doub ...
- opencv 直线拟合
一.话说直线拟合 霍夫直线检测容易受到线段形状与噪声的干扰而失真,这个时候我们需要另辟蹊径,通过对图像进行二值分析,提取骨架,对骨架像素点拟合生成直线,这种做法在一些场景下非常有效,而且效果还比较好. ...
- [OpenCV]直线拟合
OpenCV实现了直线的拟合. CV_IMPL void cvFitLine( const CvArr* array, int dist, double param,double reps, doub ...
- 【OpenCV3】直线拟合--FitLine()函数详解
一.FitLine()函数原型 CV_EXPORTS_W void fitLine( InputArray points, // 待输入点集(一般为二维数组或vector点集)OutputArray ...
最新文章
- HashSet中的add()方法( 零 )(详尽版)
- PHP魔术方法__call()篇
- 测试工作中常用的方法
- sql显示前10行数据_SPL 简化 SQL 案例详解:计算各组前 N 行
- 深度学习02——Softmax、DNN、WideDeep Model
- HelloWorld讲解
- 一、K3 WISE 实施顾问教程《进度1-谈谈实施顾问》
- 请问android如何录制acc格式音频
- 无pygame写一个python贪吃蛇
- uni-app 无网络图标不显示问题解决
- 大脑构造图与功能解析_大脑的结构和功能分区_详解人脑构造与功能
- 【时间之外】做产品必须知道的SKU是什么?
- 单机版Fate安装教程(含虚拟机搭建)
- Linux关闭防火墙、设置开放端口
- some words from website
- 在提示框中:双击浏览器缩放,浓咖啡小睡和Android引导屏幕
- Adlik Deer版本发布,模型推理加速就靠它啦
- 安装canon pixma ip1000驱动
- 讯飞AIUI+唤醒,导致唤醒监听报错10108
- 3D建模软件快捷键操作:3DMAX篇(第三期)
热门文章
- 哥大计算机专业 世界排名,2020年哥伦比亚大学计算机系统排名
- java double 排序_转载:qsort细节用法,double型的排序我竟然一直用错了~~~
- 常用字符,点,叉、、、
- YTU 3921 游戏
- c.n.discovery.InstanceInfoReplicator : There was a problem with the instance info replicator
- 如何用html5绘制圆形图片,javascript – 如何使用html5画布绘制连续的圆形图案
- 从输入URL到页面加载…
- Centos系统下搭建Smokeping 方法
- CODJ 1070 秋实大哥打游戏 并查集
- 刷题体验第一天——《录鼎记》第一章