opencv学习(二十):直线检测

霍夫直线检测原理:

1、对于直角坐标系中的任意一点A(x0,y0),经过点A的直线满足Y0=k*X0+b.(k是斜率,b是截距)

2、那么在X-Y平面过点A(x0,y0)的直线簇可以用Y0=k*X0+b表示,但对于垂直于X轴的直线斜率是无穷大的则无法表示。因此将直角坐标系转换到极坐标系就能解决该特殊情况。

3、在极坐标系中表示直线的方程为ρ=xCosθ+ySinθ(ρ为原点到直线的距离),如图所示:

 

参考链接:https://blog.csdn.net/ycj9090900/article/details/52944708

                    https://www.cnblogs.com/ssyfj/p/9275368.html

霍夫直线检测的两种方法

参考链接:https://www.cnblogs.com/ssyfj/p/9275368.html

1.获取灰度图像
2.canny边缘检测
3.获取霍夫直线信息
4.算出直线位置,画出每条直线

代码如下:

# 导入cv模块
import cv2 as cv
import numpy as np

# 直线检测  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)

#直线检测 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)

print("------------Python Opencv Tutorial!-------------")
# 读取图像,支持 bmp、jpg、png、tiff 等常用格式
src = cv.imread("F:/Projects/images/sudoku.png")
# 创建窗口并显示图像
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)  # 显示原图
line_detection(src)
line_detect_possible_demo(src)
cv.waitKey(0)
# 释放窗口
cv.destroyAllWindows()

运行效果:

猜你喜欢

转载自blog.csdn.net/weixin_39036700/article/details/84886066