2008-11-10 69 views
32

给定一个普通白色背景上的对象,是否有人知道OpenCV是否提供了轻松检测捕获帧中的对象的功能?OpenCV对象检测 - 中心点

我试图找到对象(矩形)的角点/中心点。我目前这样做的方式是通过蛮力(为对象扫描图像)并且不准确。我想知道是否有引擎盖下的功能,我不知道。

编辑详情: 大小约与小苏打罐相同。相机定位在物体上方,使其具有2D /矩形感。来自相机的方向/角度是随机的,从角点计算得出。

这只是一个白色的背景,其上的对象(黑色)。拍摄的质量与您期望从Logitech网络摄像机看到的效果相同。

一旦我得到角点,我计算中心。中心点然后转换为厘米。

它正在精炼'如何'我得到这四个角落是我正在努力的重点。你可以看到我的蛮力法与这个图像:Image

回答

25

这里已经有一个如何在OpenCV中进行矩形检测的例子(查看samples/squares.c),实际上它非常简单。

下面是他们使用的粗糙算法:

0. rectangles <- {} 
1. image <- load image 
2. for every channel: 
2.1 image_canny <- apply canny edge detector to this channel 
2.2 for threshold in bunch_of_increasing_thresholds: 
2.2.1 image_thresholds[threshold] <- apply threshold to this channel 
2.3 for each contour found in {image_canny} U image_thresholds: 
2.3.1 Approximate contour with polygons 
2.3.2 if the approximation has four corners and the angles are close to 90 degrees. 
2.3.2.1 rectangles <- rectangles U {contour} 

不是他们在做什么确切的音译,但它应该帮助你。

0

它通常被称为在其他机器视觉库blob分析。我还没有使用opencv。

4

OpenCV有一堆功能可以帮助您实现这一点。如果您使用该语言进行编程,请将包装到库中的C#.NET的Emgu.CV下载到库中。

得到的一些方法你想要什么:

  1. 查找角落像以前一样 - 例如“CornerHarris”OpenCV功能

  2. 阈值图像和计算重心 - 请参阅http://www.roborealm.com/help/Center%20of%20Gravity.php ...这是我将使用的方法。您甚至可以在COG例程中执行阈值。即cog_x + = * imagePtr < 128? 255:0;

  3. 找到图像的旋转,重心等的时刻 - 例如, “时刻”OpenCV功能。 (我没有使用过)

  4. (编辑)AForge.NET库具有角点检测功能以及一个示例项目(MotionDetector)和用于连接到摄像头的库。我认为这将是最简单的方法,假设你使用Windows和.NET。

+0

参照cvCornerHarris,你可以详细说明它是如何使用的吗?从我所看到的,你创建一个图像并运行cvCornerHarris(图像,cornerimg,blockSize(?),apertureSize(?))。而且,您如何能够从角落图像中获取信息? – 2008-11-11 18:23:04

+0

从我可以告诉它的工作方式是每像素运行一个大小为'apertureSize'的sobel边缘检测器,由'blockSize'像素组围绕'blockSize'。然后它使用公式给出在该区域中检测到的边缘的分数。角落将有水平和垂直。 – geometrikal 2008-11-11 23:20:21

7

希望这可以帮助,使用瞬间方法来获得黑白图像的质心。

cv::Point getCentroid(cv::Mat img) 
{ 
    cv::Point Coord; 
    cv::Moments mm = cv::moments(img,false); 
    double moment10 = mm.m10; 
    double moment01 = mm.m01; 
    double moment00 = mm.m00; 
    Coord.x = int(moment10/moment00); 
    Coord.y = int(moment01/moment00); 
    return Coord; 
}