我使用opencv面部检测器来定位图像内的面部。我试图将多个不同的面存储在矢量中。似乎我多次存储相同的内容。 这是我的代码:
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一切都很好,但是当我试图展示diFaces时,它向我展示了相同的图像。是否有关于push_back和存储相同图像的任何解释?
答案 0 :(得分:5)
由于你对resizedcroppedFaceImage的定义是在之外的循环,你确实为你的所有图像重用了相同的Mat结构(包括数据指针),所以它们都是相同的(将它们推入一个vector仅产生浅拷贝。
所以,推送一个clone():
diFaces.push_back( resizedcroppedFaceImage.clone() );
或使resizedcroppedFaceImage成为循环内的局部变量,因此每次传递都是一个新的Mat。