Opencv:霍夫直线未显示

6

我正在尝试在棋盘上获取霍夫直线,但算法只检测到一条直线。我使用的是Python 2.7和OpenCV 3.0。以下是代码:

def applyHoughLineTransform():
    image1 = cv2.imread('pictures/board1.png',0)
    image2 = cv2.imread('pictures/board2.png',0)
    image3 = cv2.imread('pictures/board3.png')
    image4 = cv2.imread('pictures/board4.png')

    lines1 = cv2.HoughLines(image1,1,math.pi/180.0,5)
    lines2 = cv2.HoughLines(image2,1,math.pi/180.0,5)

    lines1 = lines1[0]
    lines2 = lines2[0]

    for rho,theta in lines1:
        print ('Rho and theta:',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))

        print (x1,y1)
        print (x2,y2)

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

    for rho,theta in lines2:
        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(image4,(x1,y1),(x2,y2),(0,0,255),2)

    cv2.imwrite('pictures/board1.png',image1)
    cv2.imwrite('pictures/board2.png',image2)

    cv2.imshow('hough line 1',image3)
    cv2.imshow('hough line 2',image4)

这是我要执行霍夫线算法的Canny边缘图像: enter image description here 这是结果: enter image description here 可以看出,效果不太好。Canny算法似乎提供了非常好的边缘进行操作。我不确定自己做错了什么。我猜想可能与输入到houghLines函数中的参数有关。如果有人能指点我(或完全解决我的问题 :) ),我将非常感激。这是我使用的教程网站链接: http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html

我在你的代码中没有看到 Canny() - a-Jays
它在不同的函数中,而且所有东西都在我的主循环中。我操作的Canny图像位于霍夫之上,就像我在帖子中所述。 - user1243
3个回答

14

OPENCV 3.1.0

查看软件包示例后,这是您在Opencv 3.0.0+中应该使用的内容。

import cv2
import numpy as np
import math

image1 = cv2.imread('img.png')
gray=cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY)
dst = cv2.Canny(gray, 50, 200)

lines= cv2.HoughLines(dst, 1, math.pi/180.0, 100, np.array([]), 0, 0)
#lines1 = cv2.HoughLines(image1,1,math.pi/180.0,5)
#lines2 = cv2.HoughLines(image2,1,math.pi/180.0,5)

#lines1 = lines1[0]
#lines2 = lines2[0]

a,b,c = lines.shape
for i in range(a):
    rho = lines[i][0][0]
    theta = lines[i][0][1]
    a = math.cos(theta)
    b = math.sin(theta)
    x0, y0 = a*rho, b*rho
    pt1 = ( int(x0+1000*(-b)), int(y0+1000*(a)) )
    pt2 = ( int(x0-1000*(-b)), int(y0-1000*(a)) )
    cv2.line(image1, pt1, pt2, (0, 0, 255), 2, cv2.LINE_AA)


cv2.imshow('image1',image1)
cv2.waitKey(0)
cv2.destoryAllWindows(0)

输出

在此输入图像描述


cv2.HoughLines(dst, 1, math.pi/180.0, 100, np.array([]), 0, 0) 这些参数代表什么意思? - Zara
@Zara 这里列出了参数 https://docs.opencv.org/3.4.0/dd/d1a/group__imgproc__feature.html#ga46b4e588934f6c8dfd509cc6e0e4545a 但这并不是使这个解决方案工作的原因。请看我的答案。 - qwr

6

解决此问题的方法是从opencv 3.0切换到2.4。现在我得到了所有想要的线条。吸取教训...它之所以还是beta版本,是有原因的!以下是结果:enter image description here


1
这是认真的吗?这在网上其他地方有注明吗? - Jim G.
@JimG。我在https://opencv.org/opencv-3-0.html中没有看到具体的内容。请查看我的答案,以获取我认为“正确”的解决方案。 - qwr

3

我曾经遇到过OpenCV 3.4的同样问题。罪魁祸首在于numpy数组lines

[[[  7.99000000e+02   1.57079637e+00]] 
 [[  9.39000000e+02   1.57079637e+00]]    
 [[  1.57100000e+03   1.57079637e+00]]    
 [[  6.68000000e+02   1.57079637e+00]]    
 [[  5.46000000e+02   1.57079637e+00]]    
 [[  1.42700000e+03   1.57079637e+00]]
 ...
 [[  1.49100000e+03   1.57079637e+00]]]

请注意,这是一个三维数组,而示例代码将其视为二维数组。修复方法很简单,只需从三维数组中提取rho和theta(只更改前两行):

for line in lines:
    rho, theta = line[0]
    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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接