如何在不使用C ++中的任何库的情况下检测图像中的对象?

时间:2012-06-07 09:49:06

标签: c++ qt image-processing

我正在C++编写一个需要一点图像处理的应用程序。由于我是这个领域的新手,我不知道从哪里开始。

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

我正在考虑使用一个简单的for循环来遍历图像中的像素,直到我找到一个模式,但我想知道是否有更有效的方法。我还想看看我是否可以在不使用像OpenCV.

这样的大型库的情况下有效地做到这一点

以下是一些示例图片,任何帮助将不胜感激:

enter image description here

另外,有哪些好的资源我可以在这里了解更多关于图像处理的内容。

2 个答案:

答案 0 :(得分:1)

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

  1. 选择颜色空间。假设RGB现在可以,但在其他方面可能效果更好。

  2. 每行

    1. 对于每个像素,计算像素与其正下方像素之间的幅度差异。幅度差仅为sqrt((Xx)^ 2 +(Yy)^ 2 +(Zz)^ 2)),其中X,Y,Z是第一像素的颜色坐标,x,y,z是颜色坐标它下面的像素。对于RGB,当然XYZ = RGB。

    2. 计算低于某个阈值 magThresh 的连续差值幅度的最大游程长度。您也可以选择宽容版本:最大运行长度,但允许入侵最多 intrLen 像素长,必须跟随 contLen 像素长度运行。这是为了处理正方形边缘可能存在的线间差异。

  3. 查找最大行程长度 minWidth maxWidth 以下的最大连续行集。

  4. 因此,您已找到包含该框的行,并通过重新计算上述2.1中的数据,您将知道框在水平坐标中的位置。

    检测框边缘是通过重复相同的操作完成的,但在框内从左向右扫描。此时,您将获得近似的盒子质心,不会注意像素之间的出血。

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

答案 1 :(得分:0)

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

许多涉及迭代每个像素,并将其和邻居的值提升到矩阵中,然后与内核矩阵进行卷积。请注意,必须对每个像素进行此操作(原则上,在您的情况下,您可以在第一个发现的矩形处停止),并且对于每个颜色通道 - 因此强烈建议您按下GPU。