2012-06-07 28 views
1

我正在编写一个需要一点点图像处理的应用程序C++。由于我对这个领域完全陌生,所以我不知道从哪里开始。如何检测图像中的对象而不使用C++中的任何库?

基本上我有一个图像,其中包含一个矩形与几个框。我想要的是能够隔离rectangle (x, y, width, height)以及获得每个箱子的中心坐标(共18个)。

我想使用一个简单的for循环遍历图像中的像素,直到我找到一个模式,但我想知道是否有更有效的方法。我也想看看我是否能有效地做到这一点,而无需使用大的库,例如OpenCV.

这里有几个例子图像,任何帮助,将不胜感激:

enter image description here

此外,什么是一些很好的资源我可以在这里了解更多关于图像处理的知识。

+0

我做过的唯一图像处理是在拼贴中,我们必须找到图像最主要的颜色,我使用[cimg库](http://cimg.sourceforge.net/),我发现它很舒服。 – Adi

+2

如果你以前从未做过任何图像处理,请自己动手并使用OpenCV!如果重复所有的基本工作,比如实现矩阵数据类型以及所有这些,几乎没有什么可以获胜的。 一旦你看到你的算法的工作,你仍然可以尝试没有外部库。 –

+1

@Georg如果你不是因为商业原因而这样做的话,还有很多可以赢得的:这就是所谓的学习。 – cmannett85

回答

0

如果你坚持自己做(我个人使用OpenCV,它是工业强度和免费的),你首先需要一个边缘检测算法。在互联网上有好几个,但准备一些可怕的数学...

许多涉及迭代每个像素,并提升它,它的邻居的价值观成矩阵,然后与内核进行卷积矩阵。请注意,必须为每个像素完成此操作(原则上,在您的情况下,您可以在第一个发现的矩形中停止)以及每个颜色通道 - 因此建议将它推入GPU。

+0

由于我们正在抛出一些想法,您是否认为自从有4个线程处理从4个角开始的每个图像? – Adi

+0

如果你的意思是将图像分割成象限,并将每个线程限制在一个象限 - 是的,它会快4倍。但考虑到GPU会带给你数量级的性能提升,我完全不会理会CPU。通过使用'Thrust'库,您无需学习OpenGL/OpenCL/CUDA即可完成此任务。 – cmannett85

0

这里的检测算法可以非常简单。您的方块(BOS)始终与图像的边缘对齐,并且结构简单。这是我如何接近它。

  1. 选择一个色彩空间。现在假设RGB是可以的,但它可能在其他方面更好。

  2. 对于每个线

    1. 对于每个像素,计算像素和紧下方的像素之间的幅度差。其中X,Y,Z是第一个像素的颜色坐标,x,y,z是颜色坐标(x,y,z)它下面的像素。对于RGB,当然XYZ = RGB。

    2. 计算低于某个阈值的连续差值的最大游程长度magThresh。你也可以选择一个宽容的版本:最大游程长度,但允许入侵长达intrlen像素长,必须跟着长达contlen像素长跑。这是为了照顾正方形边缘可能的线与线之间的差异。

  3. 找到最大的一套具有上述minWidth及以下maxWidth最大运行长度的连续行。

因此你发现包含框线条,并在上面2.1重新计算数据,你会得到知道在哪里框是水平坐标。

检测框边缘是通过重复相同的事情,但在框中从左到右扫描来完成的。此时,您将拥有近似的盒子质心,不会注意像素之间的出血。

这可以通过重复运行图像通过各种卷积核心,然后进行阈值处理来完成,我想。好处是这两个操作都有非常快速的库实现。你不想手动重新执行它们,它可能会明显变慢。

相关问题