使用vector<Mat>保存视频流时需要注意:
void get_video_infor(string video)
{
VideoCapture capture(video);
Mat frame;
capture_and_frame_is_ok(capture, frame); // 自写程序,用来判断capture正确打开,并成功取得第一帧。
vector<Mat> frames;
while (!frame.empty()) {
show_index(frame, capture);
imshow("frame", frame);
frames.push_back(frame);
key_control(waitKey(1));
capture >> frame;
}
}
这样保存,会出现vector<Mat>中所有的指针都是指向的frame所指向的数据。也就是 程序执行后,frames中所有的元素指向的都capture最后一帧。
可以这么理解:
1,vector<Mat>中保存的都指针,push_back保存指针。
2,capture >> frame,只是将数据写入到frame所指向的空间,并没有改变指针。
所以每新加一个帧,都要用新的,修改如下:
void get_video_infor(string video)
{
VideoCapture capture(video);
Mat frame;
capture_and_frame_is_ok(capture, frame);
vector<Mat> frames;
while (!frame.empty()) {
Mat tem_frame = frame.clone(); // 创建新指针,并写入数据
show_index(frame, capture); // 自写程序,将当前所播放的比率写到帧上,方便知道播放了多少。
imshow("frame", frame);
frames.push_back(tem_frame);
key_control(waitKey(1));
capture >> frame;
}
}
key_control 如下:
void key_control(char c)
{
switch (c) {
case 'p':
waitKey(0);
break;
case 27:
exit(0);
break;
default:
break;
}
}