2013-08-11 2 views
0

Я пытаюсь наложить изображение поверх видеозахвата моей программы с помощью OpenCV, но у меня возникли проблемы с его работой. Я задал интересующую вас область в исходном фрейме, взятом из веб-камеры в виде прямоугольника. Затем я копирую его в исходный кадр. Однако он никогда не появляется на новом кадре, захваченном веб-камерой. Я тестировал его, и изображение загружается правильно, но по какой-то причине оно не копируется в новый кадр.Наложение изображения в 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; 
} 

Любые предложения или помощь будет оценена. Благодарю.

ответ

2

Вы преобразовали изображение в 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; 
} 
+0

На самом деле так было раньше, и это не сработало. Я тестировал его по-другому и забыл изменить его. Я просто изменил его в примере кода обратно на srcBGR.copyTo (dstROI) – TeddyG

+0

Хорошо, я отредактировал свой ответ, я протестировал этот код, и он работает. –

+0

Спасибо. Проблема заключалась в том, что я не изменял размер изображения в соответствии с размером адресата. Еще раз спасибо. – TeddyG

Смежные вопросы