opencv中的直线拟合和直线添加【本大龄新程序员的第一篇技术博客】

opencv中的直线拟合和直线添加

        在用激光雷达数据做道路边沿检测的时候,通过像素点差分阈值大略判断出道边沿点之后,通过边沿点进行直线拟合。opencv有相关函数,先将代码写出来如下。

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread('../depth_from_dat_update/89.jpg', cv2.IMREAD_GRAYSCALE)
list_point = []
for m in range(17, 51):
    for n in range(46, 89):
        differ = abs((img[m][n]-img[m][n+1]).astype('int8'))
        print(m, n, ": ", img[m][n], img[m][n+1], (img[m][n]-img[m][n+1]).astype('int8'))
        if differ > 5:
            list_point.append((n, m))   # 坐标和行列是反的,横坐标是列,纵坐标是行

print(list_point)
element_point = np.array(list_point)
# 直线拟合,line 是四元素列表,元素分别是与直线平行的单位向量的x坐标、y坐标分量、直线上固定点的x、y分量
line = cv2.fitLine(element_point, cv2.DIST_L2, 0, 0.01, 0.01)
vx = line[0]
vy = line[1]
x = line[2]
y = line[3]
lefty = int((-x*vy/vx) + y)
righty = int(((90-x)*vy/vx)+y)
# cv2.line(img, list_point[0], list_point[-1], 0, thickness=1)
cv2.line(img, (90-1, righty), (0, lefty), 0, thickness=1)
plt.imshow(img, 'gray')
cv2.imwrite("2.jpg", img)

for循环中是产生候选点的代码,专注于直线拟合部门的同学可以不用管。opencv中直线拟合函数是fitLine,必须传入的参数是需要做拟合的点,其他可选参数包括拟合的策略,比如采用cv2.DIST_L2时,就是最小二乘拟合。该函数返回的是一个四元素列表,后两个元素是得到的直线上的固定某点的x、y坐标,前两个元素是与直线平行的单位向量的x、y分量。

直线拟合好之后,可以使用opencv提供的line函数,在图片上画出该直线,因为两点确定一条直线,因此该函数必须传入的参数就是两个固定点,可选参数包括线宽、线型等。

在本例中,两个点是拟合好的直线与图片边沿的交点,高中直线与圆学得好的同学可以看出是怎样得到的。

得到的图片如下图所示。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV提供了直线拟合函数fitLine,可以用于拟合多条直线。该函数的原型如下: void fitLine(InputArray points, OutputArray line, int distType, double param, double reps, double aeps); 其,points是输入的坐标点集合,line是输出的拟合直线的参数,distType是距离类型,param是距离参数,reps是拟合精度,aeps是角度精度。 要进行多条直线拟合,可以将多组坐标点分别传入fitLine函数进行拟合,得到对应的直线参数。可以使用std::vector<cv::Point>来存储每组坐标点,然后循环调用fitLine函数进行拟合。 以下是一个示例代码,用于拟合多条直线: std::vector<std::vector<cv::Point>> pointSets; // 存储多组坐标点 std::vector<cv::Vec4f> lines; // 存储拟合直线的参数 // 循环拟合每组坐标点 for (int i = 0; i < pointSets.size(); i++) { cv::Mat pointsMat(pointSets\[i\]); cv::Vec4f line; cv::fitLine(pointsMat, line, cv::DIST_L2, 0, 0.01, 0.01); lines.push_back(line); } 这样,lines就存储了拟合得到的多条直线的参数。每个直线的参数是一个cv::Vec4f,其前两个元素表示直线上的一个点,后两个元素表示直线的方向向量。 请注意,拟合直线的精度参数reps和aeps可以根据实际需求进行调整,以获得更好的拟合效果。 #### 引用[.reference_title] - *1* *2* *3* [OpenCV 学习(直线拟合)](https://blog.csdn.net/liyuanbhu/article/details/50193947)[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^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值