我在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;
}
}