如何在图像中检测小于或大于90度的边缘(线)

4
在我的项目中,我需要检测房屋平面图的屋顶。为此,我必须使用蓝图的正面立面图。我计划使用open-cv HoughLines方法。使用该方法,我需要检测房屋的屋顶。下面我附上了房屋的图像和我的代码。
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('lol.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)

lines = cv2.HoughLines(edges,1,np.pi/180,100)
count =0
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))

    if( 20 < 180*theta/np.pi < 88):
        cv2.line(img, (x1, y1), (x2, y2), (255, 0, 255), 2)

    if (160 > 180 * theta / np.pi > 93):
        cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)

cv2.imwrite('detectP.jpg',img)
plt.imshow(img)

我使用的房屋平面图。

enter image description here

执行代码后得到的结果,

enter image description here

如您所见,检测程序会遍历整个图像。我需要它仅检测线条并在角度线的顶部绘制线条,而不是整个图像。


算法为什么应该检测左上角的0度线而不是底部的线? - Micka
那是一个错误。0度的那个没有检测到。Photoshop出错了。 - Nine3KiD
你已经在迭代lines了,for rho,theta in lines[0]:中的theta是线条的角度。你需要什么帮助? - Dan Mašek
尝试像这样编写代码:如果 20 < 180*theta/pi < 70,则绘制该线条;否则不绘制该线条。 - Micka
@DanMašek 我想要的是,上一张图片中标记的那些线条。但我得到的是第二张图片。简单来说,我不想要没有角度的水平和垂直线条。 - Nine3KiD
1个回答

1

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