qsadfasdgfgads

Untitled

Oct 28th, 2022
675
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 KB | None | 0 0
  1. #include <opencv2/core.hpp>
  2. #include <opencv2/videoio.hpp>
  3. #include <opencv2/highgui.hpp>
  4. #include <iostream>
  5.  
  6. using namespace cv;
  7. using namespace std;
  8.  
  9. void merge_images(cv::Mat* background, cv::Mat* upcoming, int x, int y)
  10. {
  11.   auto handle_cv_8uc4 = [=](int i, int j)
  12.   {
  13.  
  14.     if(upcoming->at<cv::Vec4b>(j, i)[3] > 10)//10 is only epsilon for trash hold, you can put also 0 or anything else.
  15.     {
  16.       background->at<cv::Vec4b>(y+j, x+i) = upcoming->at<cv::Vec4b>(j, i);
  17.     }
  18.   };
  19.  
  20.   auto handle_cv_8uc3 = [=](int i, int j)
  21.   {
  22.     background->at<cv::Vec4b>(y+j, x+i)[0] = upcoming->at<cv::Vec3b>(j, i)[0];
  23.     background->at<cv::Vec4b>(y+j, x+i)[1] = upcoming->at<cv::Vec3b>(j, i)[1];
  24.     background->at<cv::Vec4b>(y+j, x+i)[2] = upcoming->at<cv::Vec3b>(j, i)[2];
  25.     background->at<cv::Vec4b>(y+j, x+i)[3] = 255;
  26.   };
  27.  
  28.   for(int i = 0; i < upcoming->cols; i++)
  29.   {
  30.     for(int j = 0; j < upcoming->rows; j++)
  31.     {
  32.       if(j + y >= background->rows)
  33.       {
  34.         break;
  35.       }
  36.  
  37.       if(x + i >= background->cols)
  38.       {
  39.         return;
  40.       }
  41.  
  42.       switch(upcoming->channels())
  43.       {
  44.         case 3:
  45.         {
  46.           handle_cv_8uc3(i, j);
  47.           break;
  48.         }
  49.  
  50.         case 4:
  51.         {
  52.           handle_cv_8uc4(i, j);
  53.           break;
  54.         }
  55.  
  56.         default:
  57.         {
  58.           //maybe error?
  59.         }
  60.       }
  61.  
  62.     }
  63.   }
  64. }
  65.  
  66. int main(int, char**)
  67. {
  68.   Mat frame;
  69.   //--- INITIALIZE VIDEOCAPTURE
  70.   VideoCapture cap;
  71.   // open the default camera using default API
  72.   // cap.open(0);
  73.   // OR advance usage: select any API backend
  74.   int deviceID = 0;             // 0 = open default camera
  75.   int apiID = cv::CAP_ANY;      // 0 = autodetect default API
  76.   // open selected camera using selected API
  77.   cap.open(deviceID, apiID);
  78.   // check if we succeeded
  79.   if (!cap.isOpened()) {
  80.     cerr << "ERROR! Unable to open camera\n";
  81.     return -1;
  82.   }
  83.   //--- GRAB AND WRITE LOOP
  84.   cout << "Start grabbing" << endl
  85.        << "Press any key to terminate" << endl;
  86.  
  87.   auto background = imread("index.png");
  88.   for (;;)
  89.   {
  90.     // wait for a new frame from camera and store it into 'frame'
  91.     cap.read(frame);
  92.     cv::Mat dst(background.rows, background.cols, CV_8UC4);
  93.     merge_images(&dst, &background, 0, 0);
  94.     merge_images(&frame, &dst, 50, 50);
  95.     // check if we succeeded
  96.     if (frame.empty()) {
  97.       cerr << "ERROR! blank frame grabbed\n";
  98.       break;
  99.     }
  100.     // show live and wait for a key with timeout long enough to show images
  101.  
  102.     imshow("underlay result", frame);
  103.     if (waitKey(5) >= 0)
  104.       break;
  105.   }
  106.   // the camera will be deinitialized automatically in VideoCapture destructor
  107.   return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment