使用waitKey命令暂停和播放视频

J.S*_*ith 5 c++ opencv

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

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

非常感谢帮助!

elc*_*mon 9

参考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()
Run Code Online (Sandbox Code Playgroud)


Ahm*_*raz 3

您不需要诸如绑定密钥之类的任何东西。我编写了一个示例代码,每当您按“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 Frame\n";
            return 0;
        }
        imshow("Video",frame);
        char key = waitKey(5);
        if(key == 'p')
            playVideo = !playVideo; 
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为“playVideo”标志不是必需的。`waitKey(0)` 将无限期暂停,因此它将阻塞 while 循环,直到按下某个键。文档[此处](http://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html#waitkey)。 (3认同)