如何使用 opencv-python

问题描述

这个程序的目的是绘制房间的角落和边缘,这是我现在所处的位置:

image_current

右上角的图像是我的结果,左上角的图像是我的输入。目前,我正在使用带有高斯滤波器的精明边缘检测。但是正如您所看到的,有很多来自图像中其他细节的随机线条。

我的目标是:

image_result

到目前为止,我已经尝试过, 只显示平坦的线(0 或无限斜率):

if lines is not None:
    for line in lines:
        x1,y1,x2,y2 = line[0]
        if math.isclose(x1,tol_abs=25) or math.isclose(y1,y2,tol_abs=10):
            cv2.line(bgrimg,(x1,y1),(x2,y2),(0,255,0),1)

但这导致我丢失了一些重要的台词。 接下来,我尝试只在图像边缘显示线条:

if lines is not None:
    for line in lines:
        x1,y2 = line[0]
        if y1 > 100 and y2 > 100:
            cv2.line(bgrimg,1)

这有点适用于顶部,但由于侧面可能位于图片中的任何位置,我无法确定它们的确切位置。

有没有办法解决这个问题?如果没有,机器学习有可能吗?

解决方法

从Canny得到的信息说起。可以:

1 - 确定水平线的良好参考,

2 - 确定正确的对角线参考

3 - 确定左对角线的良好参考

4 - 从这些参考线的延伸中,您可以找到交点。

有些交叉点会很好,有些则不好。

如果水平参考线和斜参考线所成的角度在左右两侧相同或相似,则是一个很好的交集。

如我在此处添加的图片所示: https://i.stack.imgur.com/OYS2c.png

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...