opencv 将较小的图片放在较大的副本中不起作用

opencv putting smaller picture in larger copyTo not working

本文关键字:副本 不起作用 opencv      更新时间:2023-10-16

我正在尝试将较小的图片复制到较大的框架上。但我无法让它工作。它编译得很好,但没有显示任何内容。我的目标是将识别出的面复制到较大的原始框架上。

//NEW
    Mat face_resized;
    //NEW
    for(int i = 0; i < faces.size(); i++) {
        // Process face by face:
        Rect face_i = faces[i];
        // Crop the face from the image. So simple with OpenCV C++:
        Mat face = gray(face_i);
        // Resizing the face is necessary for Eigenfaces and Fisherfaces. You can easily
        // verify this, by reading through the face recognition tutorial coming with OpenCV.
        // Resizing IS NOT NEEDED for Local Binary Patterns Histograms, so preparing the
        // input data really depends on the algorithm used.
        //
        // I strongly encourage you to play around with the algorithms. See which work best
        // in your scenario, LBPH should always be a contender for robust face recognition.
        //
        // Since I am showing the Fisherfaces algorithm here, I also show how to resize the
        // face you have just found:
        //NEW
        face_resized=images[images.size()-1];
        //Mat face_resized=images[images.size()-1];
        //NEW
        cv::resize(face, face_resized, Size(im_width, im_height), 1.0, 1.0, INTER_CUBIC);
        //model->setLabelsInfo(labelsInfo);
        // Now perform the prediction, see how easy that is:
        int prediction = model->predict(face_resized);
        double confidence = 0.0;
        model->predict(face_resized,prediction,confidence);
        // And finally write all we've found out to the original image!
        // First of all draw a green rectangle around the detected face:
        rectangle(original, face_i, CV_RGB(0, 255,0), 1);

和:

//NEW
    cv::Rect roi = cv::Rect(50,50, face_resized.cols, face_resized.rows);
    cv::Mat subview = original(roi);
    subview.copyTo(original);
    //NEW
    while(tmp!=0) {
    putText(original, tmp->name, Point(10,y),FONT_HERSHEY_PLAIN,1.0,CV_RGB(100,100,0),1.0);
    y+=10;
    tmp=tmp->next;}
    }
    imshow("face_recognizer", original);

(我只复制了相关部分,如果需要可以发布更多)。

CopyTo方法将矩阵数据复制到另一个矩阵。在复制数据之前,该方法调用m.create(this->size(), this->type())以便在需要时重新分配目标矩阵。即copyto适用于相同大小的矩阵。从您的示例代码中,

cv::Mat subview = original(roi);
    subview.copyTo(original);

我看到你正在从original那里拿走 roi(subview ),并再次应对它original.由于original(大帧)的大小与subview(小帧)的大小不同,因此copyTo方法将原始帧重新分配给subview尺寸。要将小帧复制到大帧,您需要定义掩码并将其发送到copyTO以仅复制该部分(小帧),或者修改subview因为它是原始帧数据矩阵的一部分。

原因可能是源图像和目标图像的像素格式不相等。

例如,创建为cv::Mat(w , h, CV_8UC3 )和小图像的大图像,具有像素格式CV_8UC4在我的情况下不起作用。 复制只需创建一个新图像,而不是写入 ROI。