c++ - 使用OpenCV进行条纹布检测

标签 c++ opencv

我正在尝试检测布料图片中的水平和垂直条纹图案。应检测的图片的两个示例是:

enter image description here enter image description here

我的第一种方法是尝试使用霍夫线检测器。问题是衣服经常变形或起皱,所以线条不直,检测器失效。

可以假设线条是水平的或垂直的,有几度的偏差(水平和垂直条纹图案)。还有就是这些线是平行的

检测这种轻微变形的线条的好方法是什么?

最佳答案

  • 将图像转换为灰度
  • 计算梯度(例如使用sobel)
  • 对梯度图像进行水平和垂直投影
  • 阈值预测并计算峰值

我很快在 Matlab 中尝试了这个。你可以用opencv试试。使用 reduce 函数进行预测。下面是 Matlab 代码和一些结果:

im = imread('pRfUL.jpg');
gr = rgb2gray(im);
h = fspecial('sobel');
grad = imfilter(gr, h) + imfilter(gr, h'); % quick gradient

hpr = sum(grad);
vpr = sum(grad');

figure,
subplot(2,2,1), imshow(gr), title('gray scale')
subplot(2,2,2), imshow(grad), title('gradient')
subplot(2,2,3), plot(hpr), title('horizontal projection')
subplot(2,2,4), plot(vpr), title('vertical projection')

enter image description here

编辑

一个可能的改进是分别考虑水平和垂直情况。因此,每种情况都会有两次通过图像(这对于嘈杂/纹理情况可能表现更好,正如 Nallath 指出的那样——我认为他指的是双边过滤——你可以使用一些额外的过滤)。也就是说,当您寻找水平 strip 时,请使用水平过滤器,它会对水平方向的边缘产生强烈的响应。垂直情况相同。

grad = imfilter(gr, h); % for strong horizontal responses in the above code. use grad = imfilter(gr, h') for vertical

水平情况的结果:请注意水平投影和垂直偏移已显着下降

enter image description here

关于c++ - 使用OpenCV进行条纹布检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24528580/

相关文章:

c++ - 仅在 SFML 中的特定帧上执行

c++ - 如何查找指向 IPv6 地址的 SRV 记录

c++ - Opencv 中的 PCA 项目和反向项目

python - OpenCV Python 属性错误 : 'module' object has no attribute 'imshow'

python - OpenCV/Python:彩条的数量级

c++ - Windows 样式标志(如 WS_TILED 和 WS_ICONIC 只是重命名其他标志)的目的是什么? ( Windows/C++)

C++: Client-Server 分布式处理思想,发送数据后关闭连接,任务完成后重新打开?

c++ - 解析与char c++相关的整数

python - 如何创建不调用任何函数的轨迹栏? OpenCV 3.1 与 Python 2.7

image - 光流的简单案例