本文介绍了在OpenCV中叠加图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用OpenCV将图像覆盖在我的程序的视频捕获上,但我无法使其工作。我以矩形的形式在网络摄像头拍摄的原始帧中设置了感兴趣的区域。然后我将其复制到原始帧。但是它从未出现在网络摄像头捕获的新帧上。我测试了它并且图像正确加载但由于某种原因它没有被复制到新帧。

I am trying to overlay an image over the video capture of my program with OpenCV but I am having trouble getting it to work. I set the a region of interest in the original frame taken from the webcam in the form of a rectangle. Then i copy it to the original frame. However it never shows up on the new frame captured by the webcam. I tested it and the image is loading correctly but it is not being copied to the new frame for some reason.

C ++下面的代码:

Code Below in 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;
}

任何建议或帮助将不胜感激。谢谢。

Any suggestions or help would be appreciated. Thanks.

推荐答案

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

You converted image to BGR by using not converted one:change this: image.copyTo(dstROI); to this 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;
}

这篇关于在OpenCV中叠加图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-05 14:12