我正在一个测试自动化项目中,尝试使用OpenCV直观地检测应用程序中选择了哪个对象。我在使用Canny边缘检测方面取得了长足的进步。问题是当图像中有背景图形或类似图形时,我无法获得足够的精度。
由于我正在寻找一个标记选择的框,而我真正感兴趣的唯一事情就是找到该框在图像中的位置,因此我希望通过删除图像中的所有线条或形状来实现不是垂直或水平笔直的。
什么(如果有的话)是实现这一目标的最佳方法?我几乎整天都在Google上搜寻和尝试不同的方法,尤其是霍夫线,但到目前为止还没有达到我想要的结果。
我正在使用Python 2.7和OpenCV 2.4.9
请参见以下图片。
答案 0 :(得分:0)
如果您的线条实际上是与轴对齐的,并且您有一些线条的最小截止长度,则可以执行以下原始操作:
创建一些二维数组,其作用类似于遮罩(我们将其称为="[PK] = " & Str(Nz([Screen].[ActiveControl];0))
),初始化为keep
可选:执行类似膨胀的操作以填充行中的微小间隙
逐行浏览图像并检测连续的白色水平线(从黑色到白色的过渡是开始,从白色到黑色的过渡是结束,图像边缘是特殊情况)
如果行长于截断线,请在0
中用1
标记该行(从当前行开始到结束)
执行3-4,但使用列而不是行
应用遮罩
不确定一般情况下效果如何,但这是一个不错的第一次尝试。
在opencv中可能有很好的方法(就像在问题注释中提到的那样),但是我并不精通本文的全部内容。
这就像PoC一样,有些代码很慢,在python中逐个像素地工作是一个坏主意,但它表明了这个主意。使用PIL,但考虑到我只是在这里进行像素访问,应该不难重写。
keep
图片:before
图片:after