覆盖OpenCV中的图像

Overlay Image in OpenCV

本文关键字:图像 OpenCV 覆盖      更新时间:2023-10-16

我试图用OpenCV在我的程序的视频捕获上覆盖一个图像,但我很难让它工作。我在从网络摄像头拍摄的原始帧中以矩形的形式设置了一个感兴趣的区域。然后我把它复制到原来的框架上。然而,它从未出现在网络摄像头捕捉到的新画面上。我测试了它,图像加载正确,但由于某种原因,它没有被复制到新的框架中。

C++中的以下代码:

#include<opencv2/core/core.hpp>
#include<opencv2/contrib/contrib.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;
int main(){
    VideoCapture cap;
    cap.open(0);
    if(!cap.isOpened()){
        cerr << "Error opening the webcam!" << endl;
        return -1;
    }

    for(;;){
        Mat frame;
        cap>>frame; 
        Mat newFrame;
        frame.copyTo(newFrame);
        Mat image = imread("C:\User\Desktop\images\image.png");

    int cx = (newFrame.cols - 70) / 2;
        if (image.data) {
            // Get a BGR version of the face, since the output is BGR color
            Mat srcBGR = Mat(face.size(), CV_8UC3);
            cvtColor(image, srcBGR, CV_GRAY2BGR);
            // Get the destination ROI (and make sure it is within the image)
            Rect dstRC = Rect(cx, newFrame.rows/2, 70, 70);
            Mat dstROI = newFrame(dstRC);
            // Copy the pixels from src to dst.
            srcBGR.copyTo(dstROI);
        }

        imshow("frame", newFrame);
        char key = (char) waitKey(30);
        // Exit this loop on escape:
        if(key == 27)
            break;
    }   
    return 0;
}

如有任何建议或帮助,我们将不胜感激。谢谢

您使用未转换的图像将图像转换为BGR:更改此项:image.copyTo(dstROI);到此srcBGR.copyTo(dstROI);

#include<opencv2/core/core.hpp>
#include<opencv2/contrib/contrib.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;
int main(){
    VideoCapture cap;
    cap.open(0);
    if(!cap.isOpened()){
        cerr << "Error opening the webcam!" << endl;
        return -1;
    }
    Mat image = imread("D:\ImagesForTest\Lena.jpg",0);
    cv::resize(image,image,Size(70,70));  
    Mat frame;
    for(;;){
        cap>>frame; 
        Mat newFrame=frame.clone();
        int cx = (newFrame.cols - 70) / 2;
        if (!image.empty()) {
            // Get a BGR version of the face, since the output is BGR color
            Mat srcBGR = Mat(image.size(), CV_8UC3);
            cvtColor(image, srcBGR, CV_GRAY2BGR);
            // Get the destination ROI (and make sure it is within the image)
            Rect dstRC = Rect(cx, newFrame.rows/2, 70, 70);
            Mat dstROI = newFrame(dstRC);
            // Copy the pixels from src to dst.
            srcBGR.copyTo(dstROI);
        }
        imshow("frame", newFrame);
        char key = (char) waitKey(30);
        // Exit this loop on escape:
        if(key == 27)
            break;
    }   
    return 0;
}