在OpenCV中将视频序列交叉放置到另一个视频

时间:2016-11-28 08:45:19

标签: c++ visual-studio opencv image-processing video-processing

如何使用OpenCV将小视频序列添加到另一个视频?

要详细说明,我们说我有一个视频播放,这是一个互动的地方,让我们说用户观看视频的手势,并在底部或角落播放一个短序列。现有视频。

1 个答案:

答案 0 :(得分:0)

对于每个帧,您需要在视频帧中复制包含所需内容的图像。步骤是:

  1. 定义叠加框的大小
  2. 定义显示叠加框架的位置
  3. 每帧

    1. 使用某些内容填充叠加框架
    2. 将叠加帧复制到原始帧中的定义位置。
  4. 此小片段会在相机Feed的右下角显示随机噪音叠加窗口:

    #include <opencv2/opencv.hpp>
    using namespace cv;
    using namespace std;
    
    
    int main()
    {
        // Video capture frame
        Mat3b frame;
        // Overlay frame
        Mat3b overlayFrame(100, 200);
    
        // Init VideoCapture
        VideoCapture cap(0);
    
        // check if we succeeded
        if (!cap.isOpened()) {
            cerr << "ERROR! Unable to open camera\n";
            return -1;
        }
    
        // Get video size
        int w = cap.get(CAP_PROP_FRAME_WIDTH);
        int h = cap.get(CAP_PROP_FRAME_HEIGHT);
    
        // Define where the show the overlay frame 
        Rect roi(w - overlayFrame.cols, h - overlayFrame.rows, overlayFrame.cols, overlayFrame.rows);
    
        //--- GRAB AND WRITE LOOP
        cout << "Start grabbing" << endl
            << "Press any key to terminate" << endl;
        for (;;)
        {
            // wait for a new frame from camera and store it into 'frame'
            cap.read(frame);
    
            // Fill overlayFrame with something meaningful (here random noise)
            randu(overlayFrame, Scalar(0, 0, 0), Scalar(256, 256, 256));
    
            // Overlay
            overlayFrame.copyTo(frame(roi));
    
            // check if we succeeded
            if (frame.empty()) {
                cerr << "ERROR! blank frame grabbed\n";
                break;
            }
            // show live and wait for a key with timeout long enough to show images
            imshow("Live", frame);
            if (waitKey(5) >= 0)
                break;
        }
        // the camera will be deinitialized automatically in VideoCapture destructor
        return 0;
    }