c++ - 在 mat vector 中存储图像

标签 c++ opencv vector

我正在使用 opencv 人脸检测器来定位图像中的人脸。我正在尝试将多个不同的面孔存储在一个 vector 中。看来我多次存储相同的内容。 这是我的代码:

    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 和存储相同图像的解释?

最佳答案

由于您对 resizedcroppedFaceImage 的定义循环之外,您确实为所有图像重用了相同的 Mat 结构(包括数据指针),因此它们都是相同的(将它们插入vector 仅产生浅拷贝)。

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

diFaces.push_back( resizedcroppedFaceImage.clone() );

或者将 resizedcroppedFaceImage 设为循环内的本地变量,这样每次通过时它都是一个新的 Mat。

关于c++ - 在 mat vector 中存储图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21261653/

相关文章:

android - 从ndk中的jni方法调用另一个C++方法

c++ - 主函数跳过线程并且不加入以显示所需的输出

python - 如何减少两点之间的长度 OpenCV - Python

c++ - if 语句中的 vector<int>::iterator 编译失败

r - 聚类向量在 R 中得到一个零一矩阵

c++ - 字符串函数返回奇怪的值

html - 在生成的 HTML 中更改函数签名的 doxygen 格式

c++ - 使用 SFINAE 结构定义的正确方法

c++ - 以下带有 OpenCV 代码的 C++ 未被编译

c# - 在 C# ILNumerics Vector 上运行