【发布时间】:2019-05-27 00:05:22
【问题描述】:
我正在尝试编写一段代码来检测和隔离图像中的直线。我正在使用 opencv 库以及 Canny 边缘检测和霍夫变换来实现这一点。到目前为止,我想出了以下几点:
import numpy as np
import cv2
# Reading the image
img = cv2.imread('sudoku-original.jpg')
# Convert the image to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Edge detection
edges = cv2.Canny(gray,50,150,apertureSize = 3)
# Line detection
lines = cv2.HoughLines(edges,1,np.pi/180,200)
for rho,theta in lines[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)
cv2.imwrite('linesDetected.jpg',img)
理论上这段代码 sn-p 应该可以完成这项工作,但不幸的是它没有。生成的图片清楚地显示只有一条线被发现。我不太确定我在这里做错了什么以及为什么它只检测到一个特定的行。有人能找出这里的问题吗?
【问题讨论】:
-
它只显示一行,因为您告诉它只显示检测到的第一行 --
lines[0]。事实上,这只是由于 OpenCV 将数据类型从 C++ 映射到 Python 的方式的一个怪癖。如果您正确地遍历整个数组(正如@teng 所建议的那样,尽管在我的评论中提到了修改),它将正确地可视化所有 detected 行。现在,下一个问题是“为什么不能检测到所有行?” -
由于您不应该在每个问题帖子中提出多个问题,我建议将标题更改为“为什么只显示一个检测到的行?”。然后创建一个关于为什么它没有检测到所有行的新问题(包括更正的
for循环)。 -
并将
edges图像保存到文件中并查看它——应该会很好地提示您为什么找不到左起第二行。 IIRC 教程在进一步处理之前做了自适应阈值——图像的不一致照明肯定会导致问题。
标签: python opencv hough-transform canny-operator