2013-03-10 234 views
0

我在OpenCV(C++)中使用「haarcascade_mcs_upperbody.xml」來檢測上身的代碼。 它檢測單身上身。我怎樣才能讓它檢測到多個上半身。 我認爲CV_HAAR_FIND_BIGGEST_OBJECT只能檢測到最大的對象。但我不知道如何解決這個問題多人臉檢測

的代碼是這樣的:

int main(int argc, const char** argv) 
{ 
CascadeClassifier body_cascade; 
body_cascade.load("haarcascade_mcs_upperbody.xml"); 

VideoCapture captureDevice; 
captureDevice.open(0); 

Mat captureFrame; 
Mat grayscaleFrame; 

namedWindow("outputCapture", 1); 

//create a loop to capture and find faces 
while(true) 
{ 
    //capture a new image frame 
    captureDevice>>captureFrame; 

    //convert captured image to gray scale and equalize 
    cvtColor(captureFrame, grayscaleFrame, CV_BGR2GRAY); 
    equalizeHist(grayscaleFrame, grayscaleFrame); 

    //create a vector array to store the face found 
    std::vector<Rect> bodies; 

    //find faces and store them in the vector array 
    body_cascade.detectMultiScale(grayscaleFrame, faces, 1.1, 3,                                  
    CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE, Size(30,30));  
    //draw a rectangle for all found faces in the vector array on the original image 
    for(int i = 0; i < faces.size(); i++) 
    { 
     Point pt1(bodies[i].x + bodies[i].width, bodies[i].y + bodies[i].height); 
     Point pt2(bodies[i].x, bodies[i].y); 

     rectangle(captureFrame, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0); 
    } 

    //print the output 
    imshow("outputCapture", captureFrame); 

    //pause for 33ms 
    waitKey(33); 
} 

return 0; 
} 

回答

2

似乎有在你的代碼中的一些矛盾,因爲face_cascade沒有在任何地方定義,但我認爲它的類型是CascadeClassifier
detectMultiScale將所有檢測到的對象存儲在faces向量中。你確定它只包含一個對象嗎?
嘗試刪除CV_HAAR_FIND_BIGGEST_OBJECT標誌,因爲您希望檢測所有對象,而不僅僅是最大的一個。
另外,請確保您正確設置了minSizemaxSize參數(請參閱documentation),因爲這些參數決定了最小和最大可檢測物體尺寸。

+0

對不起,我編輯了錯誤的 – 2013-03-10 08:05:09