2014-04-21 40 views
0

我需要編寫一個OpenCV程序,用於檢測穿着某件T恤的人,該人穿着攝像頭中的多人。OpenCV中的矢量比較(C++)

我可以使用SURF來檢測徽標和HOGDescriptor來檢測人。

然後我可以檢查徽標的邊界框的角落是否在綁定該人的矩形的角落內。

徽標的角落都存儲在:

cv::Rect r = found[i]; 

我需要做以下對比:

std::vector<Point2f> scene_corners(4); 

周圍的人矩形的邊角使用存儲

if(scene_corners[0]>=r.tl() && scene_corners[2]<=r.br()) 

其中r.tl()和r.br()是矩形的角點。

這不行,我猜是因爲操作數不兼容。我該如何做這個比較?提前致謝。

+0

你的問題是,到底是什麼?看起來你已經寫好了你需要的代碼。你的「比較」的目標是什麼? – Aurelius

+0

我應該檢測穿着帶有特定標誌的T恤的人。因此,我檢測到人,然後檢查徽標是否存在於該人的邊界矩形內,並且只有在該徽標存在於內時才繪製矩形。由於操作數是不同類型,所以上面給出的「如果」條件無效。我不知道如何繼續。謝謝! – usb

回答

1

正如您所發現的,>=運算符未實現爲cv::Point實例。你可以做的是構建一個代表人的邊界框的cv::Rect。然後使用Rect::contains()方法來測試你的每個內在點。這應該符合您的比較標準。

// I assume that index 0 is top-left and index 2 is bottom-right 
cv::Rect person_bounds(scene_corners[0], scene_corners[2]); 
if (person_bounds.contains(r.tl()) && person_bounds.contains(r.br())) 
{ 
    // do something... 
} 
1

正如@Aurelius指出的,>=<=操作者還沒有爲cv::Point實例實現。在比較之前,您需要首先獲取數據。

您可以簡單地使用:

if(scene_corners[0].x>=r.tl().x && scene_corners[0].y>=r.tl().y 
    && scene_corners[2].x<=r.br().x && scene_corners[2].y<=r.br().y) 
{ 
    // ... 
}