2014-01-21 114 views
0

我正在使用opencv人臉檢測器在圖像中查找人臉。我試圖在矢量中存儲多個不同的面。看起來我多次存儲相同的內容。 這裏是我的代碼:將圖像存儲在mat矢量中

face_cascade.detectMultiScale(gray_image, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE); 
    Rect faceRect, eyeRect, temp; 
    //draw a rectangle for all found faces in the vector array on the original 
    image 
    cout<< faces.size()<<endl; 
    for(int i = 0; i < faces.size(); i++) 
    { 
     Point pt1(faces[i].x + faces[i].width, faces[i].y + 
      faces[i].height); 
     Point pt2(faces[i].x, faces[i].y); 

     rectangle(image, pt1, pt2, cvScalar(0, 255, 0, 0), 3, 8, 0); 
     //Create the cropped image 
     if(!faces.empty()){ 
      faceRect = cvRect(faces[i].x, faces[i].y, faces[i].width, faces[i].height); 
      croppedFaceImage = gray_image(faceRect).clone(); 


     resize(croppedFaceImage,resizedcroppedFaceImage,Size(60,60),0,0,INTER_LINEAR); 

      char k; 
      imshow("new", resizedcroppedFaceImage); 
      k = waitKey(0); 
      if (k== 'ESC') {destroyAllWindows();} 
      diFaces.push_back(resizedcroppedFaceImage); 
     } 
     else if(faces.empty()) 
     {resize(gray_image,resizedcroppedFaceImage,Size(60,60),0,0,INTER_LINEAR); break;} 
     } 

當我imshow resizedcroppedFaceImage一切正常,但是當我試圖imshow diFaces它讓我看到相同的圖像。有沒有關於push_back和存儲相同的圖像的任何解釋?

+0

你怎麼知道'diFaces'存儲相同的圖像? – herohuyongtao

+0

當我imshow(diFaces.at(0))和imshow(diFaces.at(1))時,我得到相同的圖像。我應該看到兩個不同的圖像。 –

回答

5

因爲你resizedcroppedFaceImage的定義是循環,你的確是重複使用所有的圖像相同墊結構(包括數據指針),所以他們都是一樣的(推入一個矢量引起淺僅複製)。

所以,無論是推的clone():

diFaces.push_back(resizedcroppedFaceImage.clone()); 

或使resizedcroppedFaceImage環內一個局部變量,因此它的每一個循環中的新墊。

+0

絕對正確!謝謝貝拉克! –