2014-11-03 71 views
0

我有一個使用多個Haar分類器在單個窗口中檢測多個對象的OpenCV程序。檢測到第一個對象並繪製橢圓,但是當檢測到兩個輔助對象時,對於檢測到的每個實例(我將在檢測到對象時輸出到控制檯),不繪製圓。OpenCV在一個窗口中檢測多個對象 - 未繪製

我指定三個分類,像這樣:

String cascade_name = "frontalface.xml"; 
    String nestcascade_name = "body.xml"; 
    String nested_cascade_name_two = "HandCascade.xml"; 

我然後使用加載分類:

cascade_one.load(cascade_name) 
cascade_two.load(nested_cascade_name) 
cascade_three.load(nested_cascade_name_two) 

我然後創建了三個對象三個矢量:

std::vector<Rect> firstObject; 
    std::vector<Rect> secondObject; 
    std::vector<Rect> thirdObject; 

然後我使用下面的代碼來檢測和繪製屏幕上的對象:

cascade_one.detectMultiScale(frame_gray, firstObject, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30)); 
    for(size_t i = 0; i < firstObject.size(); i++) { 
    Point center(firstObject[i].x + firstObject[i].width*0.5, firstObject[i].y + firstObject[i].height*0.5); 
    ellipse(frame, center, Size(firstObject[i].width*0.5, firstObject[i].height*0.5), 0, 0, 360, Scalar(0, 255, 0), 4, 8, 0); //GREEN 
    std::cout << " " << cascade_name << " " << timeFound() << endl; 
    } 

更改cascade_onefirstObjectcascade_name與每個對象相關的名稱。爲什麼第一個物體完美地工作,但第二個和第三個物體輸出多個檢測,儘管沒有在屏幕上繪製它們?

編輯:

全面檢測並繪製代碼:

Point center(firstObject[i].x + firstObject[i].width*0.5, firstObject[i].y + firstObject[i].height*0.5); 

,而這工作得很好,你就:讀/解釋被測物體的位置期間發生

void detectAndDisplay(Mat frame) { 
    std::vector<Rect> firstObject; 
    std::vector<Rect> secondObject; 
    std::vector<Rect> thirdObject; 
    Mat frame_gray; 
    cvtColor(frame, frame_gray, CV_BGR2GRAY); 
    equalizeHist(frame_gray, frame_gray); 
    //-- Detect object 
    cascade_one.detectMultiScale(frame_gray, firstObject, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30)); 
    for(size_t i = 0; i < firstObject.size(); i++) { 
    Point center(firstObject[i].x + firstObject[i].width*0.5, firstObject[i].y + firstObject[i].height*0.5); 
    ellipse(frame, center, Size(firstObject[i].width*0.5, firstObject[i].height*0.5), 0, 0, 360, Scalar(0, 255, 0), 4, 8, 0); //GREEN 
    std::cout << " " << cascade_name << " " << timeFound() << endl; 
    } 
    //-- detect second object 
    cascade_two.detectMultiScale(frame_gray, secondObject, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30)); 
    for(size_t k = 0; k < secondObject.size(); k++) { 

     Point center(secondObject[k].x + secondObject[k].x + secondObject[k].width*0.5, secondObject[k].y + secondObject[k].y + secondObject[k].height*0.5); 
     int radius = cvRound((secondObject[k].width + secondObject[k].height)*0.25); 
     circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0); //BLUE 
     std::cout << " " << nested_cascade_name << " " << timeFound() << endl; 
    } 
    //-- detect third object 
    cascade_three.detectMultiScale(frame_gray, thirdObject, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30)); 

    for(size_t j = 0; j < thirdObject.size(); j++) { 
     Point center(thirdObject[j].x + thirdObject[j].x + thirdObject[j].width*0.5, thirdObject[j].y + thirdObject[j].y + thirdObject[j].height*0.5); 
     int radius = cvRound((thirdObject[j].width + thirdObject[j].height)*0.25); 
     circle(frame, center, radius, Scalar(0, 0, 255), 4, 8, 0); //RED 
     std::cout << " " << nested_cascade_name_two << " " << timeFound() << endl; 
    } 
    imshow(window_name, frame); 
    } 
+0

secondObject和thirdObject向量中有多少個元素?你可以請張貼代碼來繪製它們嗎?如果它不起作用,那麼代碼中可能仍然存在一個錯誤。甚至更好:所有3個檢測步驟和繪圖步驟的完整代碼。 – Micka 2014-11-03 16:48:37

+0

我已經在我的問題中包含了完整的檢測和繪製代碼作爲編輯。 – Colin747 2014-11-03 23:18:12

+0

是否有任何第二/第三個物體被檢測到並且沒有被繪製,或者根本沒有檢測到? – Micka 2014-11-04 10:57:07

回答

0

您的問題在第二和第三個對象中犯了一個小錯誤解釋:

Point center(secondObject[k].x + secondObject[k].x + secondObject[k].width*0.5, secondObject[k].y + secondObject[k].y + secondObject[k].height*0.5); 

其中secondObject [k] .x + secondObject [k] .x可能會將檢測到的對象從您的圖像中「移出」,並且如果要在顯示對象的位置顯示對象,檢測。

如果更換線路由

Point center(secondObject[k].x + secondObject[k].width*0.5, secondObject[k].y + secondObject[k].y + secondObject[k].height*0.5); 

和(第三檢測器):

Point center(thirdObject[j].x + thirdObject[j].width*0.5, thirdObject[j].y + thirdObject[j].y + thirdObject[j].height*0.5); 

一切都應該罰款。