python opencv 霍夫线变换

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TingHW/article/details/84578460

OpenCV里的霍夫变换

在OpenCV里,上面的过程被封装在了函数cv2.HoughLines()里。它返回数组(ρ,θ). ρ的单位是像素,θ的单位是弧度。第一个参数是图像,应该是个二元图像。所以可以用canny边缘检测法或者使用阈值然后再做霍夫变换。第二个和第三个参数是ρ和θ的准确度。第四个参数是阈值,是它认为是个直线的最小的票数。记住,投票数依赖线上的点数,所以它表示了我们要检测的直线的最小长度。

import cv2
import numpy as np

img = cv2.imread('black_white2.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,10,40,apertureSize = 3)
# cv2.imshow('zhua.jpg',edges)
lines = cv2.HoughLines(edges,1,np.pi/180,200)
print(lines[0])
for i in range(len(lines)):
    
    rho,theta = lines[i][0]
    print(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))

    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)


cv2.imshow('houghlines3.jpg',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

[[405.   0.]]
405.0 0.0
258.0 1.5707964
155.0 1.5707964
262.0 1.5707964
297.0 1.5707964
223.0 0.0
151.0 1.5707964
154.0 0.034906585
158.0 0.034906585
226.0 1.5707964
62.0 1.5707964
55.0 0.08726646
222.0 1.5707964
380.0 1.5707964
-371.0 3.0717795

概率霍夫变换

在霍夫变换里,你可以看到即便对于一个有两个参数的直线,也要做一堆计算。概率霍夫变换是优化的霍夫变换,它不考虑所有点,只取一个随机的子集点,所以对于检测直线来说更有效,只是我们要减低阈值

OpenCV的实现使用cv2.HoughLinesP()。它有两个新参数:

·minLineLength - 直线最小长度,小于这个的线段就被忽略了。

·maxLineGap - 最大线隙, 如果两根线中间缝隙小于这个就认为是一根直线。

最好的事情是它直接返回直线的两个端点,在前面的例子里,你只是得到直线的参数,你还得找到左右点,这里,所有事情的简单直接。

import cv2
import numpy as np

img = cv2.imread('black_white2.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 500
maxLineGap = 30
lines = cv2.HoughLinesP(edges,1,np.pi/180,120,minLineLength,maxLineGap)

for i in range(len(lines)):

    x1,y1,x2,y2 = lines[i][0]

    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imshow('houghlines3.jpg',img)
cv2.waitKey(0)
cv2.destroyAllWindows()




4

猜你喜欢

转载自blog.csdn.net/TingHW/article/details/84578460