Opencv直线拟合的函数

本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系本人将于及时删除

目录

1.实验原理

2.实验代码

3.运行结果

1.实验原理

在图像处理中,通常会遇到根据给定的点集(比如轮廓)拟合出一条直线的情形。Opencv中提供了一个专门用于直线拟合的函数——cv::fitLine()。

	void cv::fitLine(
		cv::InputArray points, // 是二维点的cv::Mat数组,也可以是二维点的STL vector
		cv::OutputArray line, // 输出直线,Vec4f (2d)或Vec6f (3d)的vector
		int distType, // 距离类型
		double param, // 距离参数
		double reps, // 径向的精度参数
		double aeps // 角度精度参数);
points 参数是用于拟合直线的输入点集,可以是二维点的cv::Mat数组,也可以是二维点的STL vector。

line   参数是输出的直线,对于二维直线而言类型为cv::Vec4f,对于三维直线类型则是cv::Vec6f,输出参数的前半部分给出的是直线的方向,而后半部分给出的是直线上的一点(即通常所说的点斜式直线)。

distType 参数是距离类型,拟合直线时,要使输入点到拟合直线的距离和最小化(即下面公式中的cost最小化),可供选的距离类型如下表所示,ri表示的是输入的点到直线的距离。

param    参数是距离参数,跟所选的距离类型有关,值可以设置为0,cv::fitLine()函数本身会自动选择最优化的值

reps  aeps  两个参数用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为1e-2。

                        
原文链接:https://blog.csdn.net/guduruyu/article/details/69505487

2.实验代码

#include<opencv2/opencv.hpp>
#include<iostream>

int main()

{
//创建一个用于绘制图像的空白图
	cv::Mat image = cv::Mat::zeros(480, 640, CV_8UC3);

//输入拟合点
	std::vector<cv::Point> points;
	points.push_back(cv::Point(48, 58));
	points.push_back(cv::Point(105, 98));
	points.push_back(cv::Point(155, 160));
	points.push_back(cv::Point(212, 220));
	points.push_back(cv::Point(248, 260));
	points.push_back(cv::Point(320, 300));
	points.push_back(cv::Point(350, 360));
	points.push_back(cv::Point(412, 400));

//将拟合点绘制到空白图上
	for (int i = 0; i < points.size(); i++)
	{
		cv::circle(image, points[i], 5, cv::Scalar(0, 0, 255), 2, 8, 0);
	}

  cv::Vec4f line_para;
  cv::fitLine(points, line_para, cv::DIST_L2, 0, 1e-2, 1e-2);

  std::cout << "line_para = " << line_para << std::endl;

//获取点斜式的点和斜率
	cv::Point point0;
	point0.x = line_para[2];
	point0.y = line_para[3];

	double k = line_para[1] / line_para[0];

//计算直线的端点(y = k(x - x0) + y0)
    cv::Point point1, point2;
    point1.x = 0;
    point1.y = k * (0 - point0.x) + point0.y;
    point2.x = 640;
    point2.y = k * (640 - point0.x) + point0.y;

    cv::line(image, point1, point2, cv::Scalar(0, 255, 0), 2, 8, 0);

    cv::imshow("image", image);
    cv::waitKey(0);
    return 0;
}

3.运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV中,可以使用cv::fitLine函数来进行直线拟合。该函数通过最小化每个点到直线的距离总和来拟合直线。可以选择不同的距离函数,其中欧几里得距离是最常用的距离函数,对应于标准的最小二乘线拟合。如果点集中包含异常值,可以选择其他异常点影响较小的距离函数cv::fitLine函数还可以用于将一组3D点集拟合为一条直线,输入为cv::Point3i或cv::Point3f类型的数据,输出类型为std::Vec6f。\[1\] 要进行直线拟合,首先需要将点的坐标插入到std::vector<cv::Point>中。可以使用双循环来迭代像素,将非零像素点的坐标插入到vector中。\[2\] 在提取可能的点集后,可以使用cv::fitLine函数进行直线拟合。可以在黑色图像上绘制一条白线,并将其与用于检测线条的Canny轮廓图像相交,以提取探测到的第一条线段的轮廓像素。\[3\] 综上所述,要在OpenCV中进行直线拟合,可以使用cv::fitLine函数,并将点的坐标插入到std::vector<cv::Point>中。 #### 引用[.reference_title] - *1* *2* *3* [OpenCV实战系列——拟合直线](https://blog.csdn.net/m0_58523831/article/details/129660972)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值