· 2 years ago · Oct 28, 2022, 12:10 PM
1#include <opencv2/core.hpp>
2#include <opencv2/videoio.hpp>
3#include <opencv2/highgui.hpp>
4#include <iostream>
5
6using namespace cv;
7using namespace std;
8
9void 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
66int 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}