在席子传染媒介存放图象

Jos*_*mon 0 c++ opencv vector

我正在使用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;}
       }
Run Code Online (Sandbox Code Playgroud)

当我imshow resizedcroppedFaceImage一切都很好,但当我试图显示diFaces它显示我相同的图像.是否有关于push_back和存储相同图像的任何解释?

ber*_*rak 5

因为resizedcroppedFaceImage的定义在循环之外,所以你确实为你的所有图像重用了相同的Mat结构(包括数据指针),因此它们都是相同的(将它们推入矢量只产生浅拷贝).

所以,要么推一个clone():

diFaces.push_back( resizedcroppedFaceImage.clone() );
Run Code Online (Sandbox Code Playgroud)

或者使resizedcroppedFaceImage成为循环内的局部变量,因此每次传递都是一个新的Mat.