OpenCV等毫秒级间隔抽取mp4为png

本文介绍在使用OpenCV 3.3.0版本的C++API从MP4中按50ms间隔抽取PNG图片时遇到的问题。在OpenCV 3.2.0版本下正常工作,但在升级到3.3.0版本后出现精度问题,推测可能与关键帧读取有关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用OpenCV的C++ API抽取mp4为png时,发现CV_CAP_PROP_POS_MSEC属性居然在OpenCV 3.3.0版本下失效。
##一、需求

  • 把mp4等时间间隔抽取为png
  • 环境:Mac OS
  • 语言:C++
  • 抽取间隔:50ms

##二、问题描述
在OpenCV 3.2.0下可以按如下方式实现(简化代码):

VideoCapture *cap = new VideoCapture("/path/to/video");
    Mat lastFrame;
    int count = 100;
    while (--count >= 0) {
        // 等时间间隔抽取图片
        cap->set(CV_CAP_PROP_POS_MSEC, count * 50);
        Mat frame;
        // 获取帧
        cap->read(frame);
        if (frame.empty()) {
            break;
        }
        // 获得此帧据mp4开始的时间间隔,单位ms
        long timeFromBegin = static_cast<long>(cap->get(CV_CAP_PROP_POS_MSEC));
        try {
            string outputDir = "/path/to/output";
            stringstream ss;
            string fileName;
            vector<int> compression_params;
            compression_params.push_back(16);
            compression_params.push_back(9);
            ss << outputDir << "/" << timeFromBegin << ".png" << endl;
            ss >> fileName;
            // 写入文件
            imwrite(fileName, frame, compression_params);
        } catch (cv::Exception &ex) {
            cout << "Caught error " << ex.what() << endl;
        }
    }

然而,某天手一抖

brew update
brew upgrade

发现OpenCV升级到了3.3.0。。。
偶然间发现,之前写的等间隔抽取mp4的代码的精度出现了严重的问题,通过brew switch把OpenCV降级到3.2.0后问题消失。
怀疑在OpenCV 3.3.0上,cap->set(CV_CAP_PROP_POS_MSEC, count * 50)失效,不知道为什么,可能是只读取了关键帧,而不是下一个50ms吧,。
时间有限,先这么记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello2mao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值