使用waitKey来暂停和播放视频



我在OpenCV中有一个VideoCapture,我可以成功显示给定的视频。我现在想做的是通过按下一个键来暂停和播放(选择哪个键,只要它有效)。我一直在阅读关于waitKey,但有一些关于这整个事情我不得到(ASCII)和如何绑定密钥。我所理解的是它是用来让highgui处理的,但也可以用于其他目的?

如果很难/不可能暂停视频并重新开始,我会很高兴在按下键时延迟。

非常感谢你的帮助!

参考OpenCV文档cv::waitKey(delay),当delay <= 0将导致函数无限等待一个关键事件

下面是一个示例Python脚本,用于显示从计算机的网络摄像头捕获的帧。当按下q时,退出循环。但是,如果按下p,则显示暂停,直到按下任何其他键:

import cv2
cap = cv2.VideoCapture(0) # getting video from webcam
while cap.isOpened():
    ret, img = cap.read()
    cv2.imshow("Frame",img)
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
    if key == ord('p'):
        cv2.waitKey(-1) #wait until any key is pressed
cap.release()
cv2.destroyAllWindows()

您不需要绑定键之类的东西。我写了一个示例代码,当你按"p"时,它将播放/暂停视频。

#include <iostream>
#include <fstream>
#include <string>
#include "opencv2/opencv_modules.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace std;
using namespace cv;
int main(int argc, char **argv)
{
    bool playVideo = true;
    VideoCapture cap(argv[1]);
    if(!cap.isOpened())
    {
        cout<<"Unable to open video "<<argv[1]<<"n";
        return 0;
    }
    Mat frame;
    while(1)
    {
        if(playVideo)
            cap >> frame;
        if(frame.empty())
        {
            cout<<"Empty Framen";
            return 0;
        }
        imshow("Video",frame);
        char key = waitKey(5);
        if(key == 'p')
            playVideo = !playVideo; 
    }
    return 0;
}

我有和你一样的问题。我用Python而不是c++解决了这个问题,但我认为背后的逻辑是一样的。

import cv2
cap = cv2.VideoCapture('my.avi')
while True:
    ret, frame = cap.read()
    key = cv2.waitKey(1) & 0xff
    if not ret:
        break
    if key == ord('p'):
        while True:
            key2 = cv2.waitKey(1) or 0xff
            cv2.imshow('frame', frame)
            if key2 == ord('p'):
                break
    cv2.imshow('frame',frame)
    if key == 27: 
        break
cap.release()
cv2.destroyAllWindows()

如果你想暂停和播放p使用

if(cv::waitKey(1) == 'p')
    while(cv::waitKey(1) != 'p');

如果您想用相同的键暂停和取消视频(例如:'空格'),并通过Esc退出视频,即使它已暂停,然后你可以做以下操作:

enum Keys {ESC = 27, SPACE = 32};
cv::Mat newFrame;
bool stopVideo = false;
while(video.read(newFrame) && !stopVideo)
{
    cv::imshow("video", newFrame);
    switch(cv::waitKey(25))
    {
        case SPACE:
            while(true)
            {
                int k = cv::waitKey(0);
                if (k == SPACE)
                {
                    break;
                }
                else if (k == ESC)
                {
                    stopVideo = true;
                    break;
                }
            }
            break;
        case ESC:
            stopVideo = true;
            break;
    }
}

最新更新