Hough变换未检测到突出的线条

Aru*_*iRC 7 opencv image-processing computer-vision visual-c++

在图像上运行Canny边缘检测器后,我得到清晰的线条.但是当在Canny edgemap图像上运行时,Hough线函数似乎在相当突出的线上丢失了.我只保留垂直和水平的Hough线(公差为15度).很多额外的线条出现了,但是没有拾取明确可见的线条限制矩形.

这是片段:

cvCanny( img, canny, 0, 100, 3 );
lines = cvHoughLines2( canny, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 35, 20, 10 );
Run Code Online (Sandbox Code Playgroud)

主要目的是检测表示链表节点的矩形框.但是,square.c示例程序将只检测完美的矩形,而不是箭头触摸矩形边界.

你能否解释一下Hough线功能的变化,这有助于我获得与Canny边缘图像中清晰可见线相对应的线条?

踝关节

rwo*_*ong 12


(补充:shernshiou建议的预处理步骤.)

预处理步骤:

  1. 对图像进行阈值处理,
  2. 使用连通组件
  3. 从连接组件结果中,检测并移除小对象 - 每个框下方和中间的四位数组.

(备注.阈值处理步骤只是连接组件所需的预处理步骤.)


如果你想只检测完美的水平和垂直线,我的建议是在Hough变换之前执行水平和垂直边缘增强(通过卷积).

这将使真实线条更容易在Hough投影中"达到峰值",并增加OpenCV拾取线的机会.

步骤将是:

  1. 从输入计算Canny边缘图像
  2. 在Canny边缘图像上应用水平Sobel滤波
  3. 在水平增强边缘图像上应用Hough线检测.
  4. 在Canny边缘图像上应用垂直Sobel滤波.(注意:使用步骤1的结果,而不是步骤2的结果)
  5. 在垂直增强边缘图像上应用Hough线检测.
  6. 合并水平和垂直线并显示结果.


jil*_*wit 7

你确实阅读了文档吗?

我有几个选择:

  1. 您错过的线条(最值得注意的是图像中最右侧框中最左侧的垂直线条)相当短.尝试降低阈值(cvHoughLines2的第5个输入变量).此阈值只是必须位于该行上的像素数.从图像中我猜测你错过的线上确实不到35个像素.
  2. 第6个输入变量表示最小行长度.我假设这是以像素为单位,所以使用第5个参数,你需要35行像素,但你搜索20像素或更长的行.您设置此变量的方式不起作用.降低第5个变量,如果你发现许多无用的短线,则提高这个变量.
  3. 降低第7个参数以禁止线条中存在较大间隙.这将消除一些斜线.

简而言之,请使用参数5,6和7的不同值再次尝试.

我会尝试参数5和7的较低值,以及6的相似或略高的值.由于2以上5应始终小于或等于6才能产生效果.如果5较低,则7应该至少等于5和6之间的差值.