1.imshow()显示图像帧时暂停键的用法
//严格按照下面这种方式和顺序不会有问题,例如在imshow后面直接跟cv::waitKey(1)后再char c=...会有问题。
cv::namedWindow("light_object", cv::WINDOW_NORMAL);
cv::resizeWindow("light_object", 640, 480);
cv::imshow("light_object", frame);
char c = static_cast<char>(cv::waitKey(50));
if (c == ' ') {
cv::waitKey(0);
}
2.opencv播放视频 以及 设置任意键为暂停键
【该方法不实用,可能会暂停不了,时灵时不灵】
对于cv::VideoCapture的使用可以参考 https://blog.csdn.net/guduruyu/article/details/68486063
cv::Mat img;
std::string videopath="./path/..";
cv::VideoCapture cap;
cap.open(videopath);
if (!cap.isOpened()) {
std::cout << "Can't open the video file!"<<std::endl;
return -1;
}
cap >> img; // 把捕获的帧传送给img。在这一句后面设置暂停键
//cap.read(img); // 这句话和cap >> img等价。
// 设置任意键为暂停键,即暂停捕获视频中的帧
if(cv::waitKey(1)>=0) //有键盘上的键按下时,该函数返回值>=0;没有键按下时,该函数返回值为-1。cv::waitKey(1)为等待1ms;
cv::waitKey(0); //cv::waitKey(0);为一直等待直到有键按下。
// 判断是否图片是否为空,为空说明没有打开video。
if (img.empty()) {
cap.open(videopath);
}
// 设置任意键暂停
if(cv::waitKey(1)>=0)
cv::waitKey(0);
// 推荐用下面这种方式
// cv::waitkey()中的延迟时间需要根据程序定义,太少了捕捉不到按键,我目前没碰到这种情况,碰到设置再大延时也捕获不到按键的情况。
// cv::waitKey(1)括号中必须填上1或者别的数字,否则会一直等待键盘按下,当键盘某键按下时,会返回该键的ascii码
char key=cv::waitKey(3);
if(key ==32) //空格键暂停,空格键对应的ascii码是32
cv::waitKey(0);
if(key ==9){ //tab键快进30帧,设置不了使用右箭头
for(int i=0;i<30;i++) //快进30帧
cap >> img; //快进多少帧,就把这一句执行多少次
}
【不推荐】使用下面这种方法,因为我在apollo上使用根本捕获不了按键,我目前还不知道是什么原因,必须使用以上方式把cv::waitKey(1)先赋值给一个char变量才行。
if(cv::waitKey(3) ==32) //空格键暂停
cv::waitKey(0);
if(cv::waitKey(3) ==9){ //tab键快进30帧,设置不了使用右箭头
for(int i=0;i<30;i++) //快进30帧
cap >> img; //快进多少帧,就把这一句执行多少次
}
3.当使用imshow显示每一帧画面时,出现卡顿的解决办法
读取每一帧在哪个{}
中,imshow()
就应该在哪个{}
中,必须出现在同等级的{}
中,不能出现在他下面的二级{{imshow()}}
中。否则,当二级{}
不符合条件时,执行不到二级{}
里面的imshow()
时候,就会出现画面卡顿。