使用 vector保存mat

使用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;
    }
}



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值