代码之家  ›  专栏  ›  技术社区  ›  Abhijith Bagepalli

在OpenCV中将视频序列与另一个视频交互播放

  •  2
  • Abhijith Bagepalli  · 技术社区  · 8 年前

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

    更详细地说,假设我有一个视频播放,它是交互式的,比如说,观看视频的用户做出了一些手势,在现有视频的底部或角落播放了一个短序列。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Miki    8 年前

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

    1. 定义覆盖框架的大小
    2. 定义显示覆盖框架的位置
    3. 对于每个帧

      1. 用一些内容填充覆盖框架
      2. 将覆盖帧复制到原始帧中定义的位置。

    这个小片段将在相机提要的右下角显示一个随机噪声叠加窗口:

    #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;
    }