2008-11-10 74 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; 
}