最近在matlab平台和opencv上都尝试了以下霍夫变换直线识别。
发现matlab中可以通过设置相近直线距离和最小长度,去除一些角度相近、距离相近的直线;
而opencv的houghline函数没有类似的功能,houghlinesP又不能直接返回rho、theta,总之无法自动剔除相近的直线(当然也很可能是我没用对),于是自己写了下面的函数:
功能大概是检测houghlines返回的参数列表,将theta和rho差值均小于一定范围的直线合并。但目前也有不足,即由于houghlines不返回检测到的直线模量,因此实际上保留的是几条相似直线中第一个被遍历到的直线。
具体代码如下:
import cv2 as cv
import numpy as np
def rho_theta_draw(src: np.ndarray, rho, theta):
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * (a))
x2 = int(x0 - 1000 * (-b))
y2 = int(y0 - 1000 * (a))
cv.line(src, (x1, y1), (x2, y2), (0, 0, 255), 2) # 画直线,对象、起点、终点、颜色、线宽
def hough_draw(lines: np.ndarray, src: np.ndarray, min_rho=10, min_theta=np.pi/90):
'''
函数根据HoughLine函数返回参数进行作图,且自动剔除相近直线
函数将把theta差值小于一定范围,并且在此基础上,rho差值小于一定范围的直线剔除
'''
drew_list = [] # 创建空列表用于存储已经作图的theta
i = 0
j = 0
draw_flag = 1
# 检查lines是否为空,否则作出第一条线
if len(lines) != 0:
rho, theta = lines[0, 0] # 读取第一条直线数据
rho_theta_draw(src, rho, theta)
i += 1
drew_list.append({'theta': theta, 'rho': rho}) # 在drew_list中存入第一个直线数据
for rho, theta in lines[1:, 0]: # lines是一个三维深度的数组,此处遍历每个[rho, theta]元素
for past_line in drew_list:
theta_error = abs(past_line['theta'] - theta)
rho_error = abs(past_line['rho'] - rho)
if theta_error
起到剔除作用的主要是hough_draw这个函数,rho_theta_draw只是一个用于简化代码用的小函数。
hough_draw要求输入houghlines返回的lines,走图对象src,最小距离rho(默认为10)和最小theta(单位为rad,默认为pi/90,即2°)。
运行效果如下:
不做剔除时,总共画了五条直线
设置min_rho=40,min_theta=pi/180,即1°时:
最底下的时进行作图的直线参数。
修改min_theta=pi/90,即2°时:
最后还是得承认,目前作为opencv新手,各种函数用的还是很垃圾,如果库内自带函数有上述函数的功能,那只能说是很尴尬了。
函数还有提升空间,如果换成基于houghlinesP去编程,应该能将直线模量进一步考虑进去,不过直线检测只是当前毕设里面一个弄着玩的功能,估计是不会继续深入了。
Original: https://blog.csdn.net/TPenny68/article/details/124324932
Author: TPenny68
Title: opencv霍夫变换–剔除相近直线
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/702932/
转载文章受原作者版权保护。转载请注明原作者出处!