python - Opencv:霍夫线不显示

标签 python opencv opencv3.0 hough-transform

所以我试图在棋盘上获得霍夫线,但该算法导致只检测到一条线。我正在使用 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)

这是我执行 hough 线算法的 canny 边缘图像: enter image description here

结果如下: enter image description here

如您所见,非常蹩脚。精明的算法似乎提供了非常好的操作优势。我不完全确定我做错了什么。我想这与输入 houghLines 函数的参数有关。如果有人能指出正确的方向(或完全解决我的问题 :)),我将不胜感激。这是我正在使用的教程网站的链接: http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html

最佳答案

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)

输出

enter image description here

关于python - Opencv:霍夫线不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27537149/

相关文章:

ios - OpenCV 线/标尺检测

python - 使用可变数量的 WHERE 子句来匹配任意数量的关键字 pysqlite

python - 检测表面的灰度

opencv - 如何在 OpenCV 中训练阶段树分类器而不是级联来进行人脸检测?

opencv - 如何像 Matlab 一样在 OpenCV 中设置具有特定值的整个矩阵

c++ - OpenCV C++ 中方差局部二进制模式 (VLBP) 的直方图计算

python - 一次热编码后连接两个数据帧

python - Selenium Chromedriver 不导航到 url

python - 使用生成器进行列表理解

c++ - 使用 OpenCV 2.4.9 构建 ROS 包时出现问题