OpenCV 直线检测

Hough变换是经典的检测直线的算法。其最初用来检测图像中的直线,同时也可以将其扩展,以用来检测图像中简单的结构。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

变换图示
在这里插入图片描述

霍夫直线检测的两种方法
1.获取灰度图像
2.canny边缘检测
3.获取霍夫直线信息
4.算出直线位置,画出每条直线
一:HoughLines霍夫变换

def line_detection(image):
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    edges = cv.Canny(gray,50,150,apertureSize=3)    #apertureSize是sobel算子大小,只能为1,3,5,7
    lines = cv.HoughLines(edges,1,np.pi/180,200)  #函数将通过步长为1的半径和步长为π/180的角来搜索所有可能的直线
    for line in lines:
        rho,theta = line[0]  #获取极值ρ长度和θ角度
        a = np.cos(theta)  #获取角度cos值
        b = np.sin(theta)  #获取角度sin值
        x0 = a * rho  #获取x轴值
        y0 = b * rho  #获取y轴值  x0和y0是直线的中点
        x1 = int(x0 + 1000*(-b))  #获取这条直线最大值点x1
        y1 = int(y0 + 1000*(a))   #获取这条直线最大值点y1
        x2 = int(x0 - 1000 * (-b))  #获取这条直线最小值点x2  
        y2 = int(y0 - 1000 * (a))  #获取这条直线最小值点y2  其中*1000是内部规则
        cv.line(image,(x1,y1),(x2,y2),(0,0,255),2)  #开始划线
    cv.imshow("image line",image)



src = cv.imread("./l.png")  #读取图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
cv.imshow("input image",src)    #通过名字将图像和窗口联系

line_detect_possible_demo(src)

cv.waitKey(0)   #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
cv.destroyAllWindows()  #销毁所有窗口

在这里插入图片描述

相关知识补充
(一)HoughLines方法
def HoughLines(image, rho, theta, threshold, lines=None, srn=None, stn=None, min_theta=None, max_theta=None): # real signature unknown; restored from doc
cv.HoughLines(edges,1,np.pi/180,200)
cv2.HoughLines函数输出的是[float, float]形式的ndarray,其中每个值表示检测到的线(ρ , θ)中浮点点值的参数。
第一个参数image:是canny边缘检测后的图像

第二个参数rho和第三个参数theta:对应直线搜索的步长。在本例中,函数将通过步长为1的半径和步长为π/180的角来搜索所有可能的直线。

最后一个参数threshold:是经过某一点曲线的数量的阈值,超过这个阈值,就表示这个交点所代表的参数对(rho, theta)在原图像中为一条直线
观察前面的例子得到的结果图片,其中Hough变换看起来就像在图像中查找对齐的边界像素点集合。
但这样会在一些情况下导致虚假检测,如像素偶然对齐或多条直线穿过同样的对齐像素造成的多重检测。
二:HoughLinesP概率霍夫变换(是加强版)使用简单,效果更好,检测图像中分段的直线(而不是贯穿整个图像的直线)

def line_detect_possible_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    edges = cv.Canny(gray, 50, 150, apertureSize=3)  # apertureSize是sobel算子大小,只能为1,3,5,7
    lines = cv.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=50,maxLineGap=10)  #函数将通过步长为1的半径和步长为π/180的角来搜索所有可能的直线
    for line in lines:
        print(type(line))   #多维数组
        x1,y1,x2,y2 = line[0]
        cv.line(image,(x1,y1),(x2,y2),(0,0,255),2)
    cv.imshow("line_detect_possible_demo",image)

在这里插入图片描述

相关知识补充:
(一)HoughLinesP方法
def HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None): # real signature unknown; restored from doc
cv.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=50,maxLineGap=10)

 第一个参数是需要处理的原图像,该图像必须为cannay边缘检测后的图像;

第二和第三参数:步长为1的半径和步长为π/180的角来搜索所有可能的直线

第四个参数是阈值,概念同霍夫变换

第五个参数:minLineLength-线的最短长度,比这个线短的都会被忽略。

第六个参数:maxLineGap-两条线之间的最大间隔,如果小于此值,这两条线就会被看成一条线。

这个函数的返回值就是直线的起点和终点。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV在不同版本中提供了不同的直线检测方法。在OpenCV 3中,加入了LSD(Line Segment Detector)直线检测算法。但是在OpenCV 4中,由于许可证问题,LSD直线检测算法被移除了。引用和展示了使用OpenCV进行直线检测的代码示例。 在引用中的代码示例中,使用了Canny边缘检测算法和自定义的CannyLine类来实现直线检测。首先,将图像读取为灰度图像,然后通过Canny边缘检测算法获取边缘。接下来,使用CannyLine类中的cannyLine函数检测直线,并通过cv::line函数在图像上绘制检测到的直线。 在引用中的代码示例中,使用了FLD(Fast Line Detector)直线检测算法。首先,将图像读取为灰度图像,然后使用cv2.ximgproc.createFastLineDetector()创建一个FLD对象。接下来,使用fld.detect函数检测直线,并通过cv2.line函数在图像上绘制检测到的直线。 通过这两个代码示例,可以实现直线检测并在图像上绘制检测到的直线。在OpenCV 4中,可以使用其他的直线检测算法,如Hough Transform等来实现直线检测。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Opencv中的直线检测算法](https://blog.csdn.net/juluwangriyue/article/details/116109730)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [opencv 九种直线检测方法汇总](https://blog.csdn.net/m0_51233386/article/details/124171578)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值