天天看点

opencv 叠加两张图,在OpenCV中叠加图像

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.

Code Below in C++:

#include

#include

#include

#include

#include

#include

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.

解决方案

You converted image to BGR by using not converted one:

change this: image.copyTo(dstROI); to this srcBGR.copyTo(dstROI);

#include

#include

#include

#include

#include

#include

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;

}