OpenCV 不报告准确的帧速率/计数

2023-12-23

我有一个 33 秒的视频,正在尝试使用 OpenCV 进行处理。我的目标是确定每个帧对应的时间实例(相对于视频的开始)。我这样做是为了能够比较以不同帧速率录制的同一场景的视频帧。

什么在起作用:

  • FPS 正确报告为 59.75。这与什么是一致的ffprobe报告,所以我很高兴相信这是正确的。

我遇到的问题是:

  • CAP_PROP_POS_MSEC返回不正确的值。到视频结束时,时间长达 557924 毫秒(超过 9 分钟)。对于 33 秒的视频来说,这是不对的。
  • CAP_PROP_FRAME_COUNT也是不正确的。据报告为 33371,在 59.75 fps 下可以提供超过 9 分钟的镜头。与上面的错误一致,但仍然不正确。
  • CAP_PROP_POS_FRAME同样是不正确的。

视频可以找到here http://dl.dropbox.com/u/15815235/sequence.mp4(约 10MB)。

关于可能出什么问题的任何想法吗?

ffprobe output:

FFprobe version SVN-r20090707, Copyright (c) 2007-2009 Stefano Sabatini
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 0 / 52.20. 1
  libavformat   52.31. 0 / 52.31. 0
  built on Jan 20 2010 00:13:01, gcc: 4.4.3 20100116 (prerelease)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/misha/Dropbox/Public/sequence.mp4':
  Duration: 00:00:33.37, start: 0.000000, bitrate: 2760 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 1920x1080, 59.75 tbr, 1k tbn, 2k tbc
    Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16

完整代码:

#include <iostream>
#include <assert.h>

#include <cv.h>    
#include <highgui.h>

#include <cmath>
#include <iostream>
#include <string.h>
#include <stdio.h>

extern "C"
{
#include "options.h"
}

using namespace std;

#define DEBUG 0

static void
print_usage(char *argv0)
{
    cerr << "usage: " << argv0 << " video.avi [options]" << endl;
}

int main(int argc, char** argv)
{
    if (argc < 2)
    {
        print_usage(argv[0]);
        return -1;
    }

    int           step      = 30;
    struct Option options[] =
    {
        { "step",        1, &step },
        { NULL,          0, NULL }
    };

    int ret = parse_options(2, argc, argv, options);
    if (ret == 0)
    {
        print_usage(argv[0]);
        return -1;
    }

    CvCapture *capture = cvCaptureFromFile(argv[1]);
    int counter = 0;
    while (cvGrabFrame(capture))
    {
        ++counter;

        IplImage *frame = cvRetrieveFrame(capture);
        double millis   = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_MSEC);
        double current  = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES);
        double total    = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
        printf("%d %d/%d %f\n", counter, (int)current, (int)total, millis);
        int min = (int)(millis/1000/60);
        millis -= min*60000;
        int sec = (int)(millis/1000);
        millis -= sec*1000;

        printf("%d %02d:%02d:%f\n", counter, min, sec, millis);
    }
    cvReleaseCapture(&capture);

    return 0;
}

始终告知您正在使用的软件版本:您使用的是哪个 OpenCV 版本?您的版本可能是旧版本,因此如果可能的话请更新到最新版本。

如果您的视频文件是其他较大视频的一部分,则此信息实际上可能是正确的,因为:

CV_CAP_PROP_POS_MSEC - film current position in milliseconds or video capture timestamp

OpenCV 可能只是从文件头读取所有这些内容,这显然是错误的。如果有人使用斧头(或其他中世纪工具)从原始视频中剥离该片段,则可能会发生这种情况。

您应该尝试使用您制作的视频,并且您知道它们没有被篡改。

最坏的情况是,您将不得不自己实现这些功能。没什么大不了的。

EDIT:@misha我一开始没有注意到你正在使用:

CvCapture *capture = cvCaptureFromFile(argv[1]);

将其替换为cvCaptureFromAVI()如果可以的话,并且ALWAYS检查 OpenCV 调用的返回值:

CvCapture *capture = cvCaptureFromAVI(argv[1]);
if(!capture) 
{
    printf("!!! cvCaptureFromAVI failed (file not found?)\n");
    return -1; 
}

前几天我分享了一个代码使用OpenCV读取视频文件,然后将帧保存为磁盘上的JPG图像 https://stackoverflow.com/questions/4350698/opencv-how-to-split-a-video-into-image-sequence/4353483#4353483。它还使用传统的方式报告当前的 FPScvGetCaptureProperty(capture, CV_CAP_PROP_FPS);所以你看看这个可能会很有趣。去看看吧。

EDIT:

您还应该检查这个线程 https://stackoverflow.com/questions/1356543/cvgetcaptureproperty-always-return-0-for-cv-cap-prop-frame-count关于使用 OpenCV 进行帧计数;

顺便说一句,我刚刚更新了我的 Ubuntu 系统上的一些库并重新编译OpenCV-2.1.0.tar.bz2 (using cmake)。我改变了我的源代码(使用cvCaptureFromAVI())在每个帧上使用调试方法打印内容。看来它有效:

* Filename: sequence.mp4
* FPS: 59
...
...
...
17 00:00:567.000000
18 601/33371 601.000000
18 00:00:601.000000
19 634/33371 634.000000
19 00:00:634.000000
20 668/33371 668.000000
20 00:00:668.000000
21 701/33371 701.000000
21 00:00:701.000000
22 734/33371 734.000000
22 00:00:734.000000
23 768/33371 768.000000
23 00:00:768.000000
24 801/33371 801.000000
24 00:00:801.000000
25 835/33371 835.000000
25 00:00:835.000000
26 868/33371 868.000000
26 00:00:868.000000
27 901/33371 901.000000
27 00:00:901.000000
28 935/33371 935.000000
... 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV 不报告准确的帧速率/计数 的相关文章

  • 如何使用带有 EventHandler 的 NSubstitute 引发事件?

    我有一个定义多个事件的接口 其中一些事件具有委托类型EventHandler
  • 如何在超时后关闭上下文菜单?

    我需要有一个上下文菜单 当前使用 TrackPopupMenu 创建 在一段时间不活动后自动关闭 我正在尝试搜索 但只找到相反的结果 如何activate超时后的弹出窗口 或针对特定应用程序的专门内容 我发现的唯一接近的事情是枚举桌面的子级
  • 尝试写一个无锁的单链表,麻烦去除

    我正在尝试编写一个无锁单链表 最终一致性不是问题 有人遍历可能包含不正确项目的列表 我认为我正确添加了项目 循环和Interlocked CompareExchange 但我不知道如何删除节点 列表中的任何位置 因为我必须获取前一个项目并设
  • AVAssetExportSession 输出文件

    AVAssetExportSession 输出文件应该是什么样子 我正在尝试压缩 ALAsset 项目中的视频 但它不起作用 我猜输出文件与它有关 这是我正在使用的代码 NSString destinationPath NSHomeDire
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • OpenCV 2.4.3rc 和 CUDA 4.2:“OpenCV 错误:没有 GPU 支持”

    我在这张专辑中上传了几张截图 https i stack imgur com TELST jpg https i stack imgur com TELST jpg 我正在尝试在 Visual Studio 2008 中的 OpenCV 中
  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • std::call_once 可重入且线程安全吗?

    std call once http en cppreference com w cpp thread call once是线程安全的 但它也是可重入的吗 我使用 VS2012 调试和发布 进行的测试表明 调用std call once从单
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • 使用 LINQ 更新 IEnumerable 对象的简单方法

    假设我有一个这样的业务对象 class Employee public string name public int id public string desgination public int grade List
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当

随机推荐

  • 如何在 Dotrine 2 中配置命名策略

    我读了chapter http docs doctrine project org projects doctrine orm en latest reference namingstrategy html关于手册中的 Doctrine 命
  • Tkinter - 等重的列不等宽

    我有一个包含三列的 Tkinter 顶级窗口 所有三列均配置为具有相同的权重 内柱0 and 2是子框架 里面有Listbox小部件 内柱1是一组按钮 由于某种原因 尽管我的 3 列具有相同的权重 但这些列表框 强制 它们的列占用更多空间
  • mypy:“__eq__”与超类型“object”不兼容

    这是我的代码 class Person def init self id self id id def eq self other Person gt bool return self id other id def compare sel
  • 转换忽略 sf::Sprite 的起源

    在 SFML 中变换精灵 不考虑它的新原点 在我的例子中 sf Sprite 围绕左上角 0 0 的轴旋转 无论其原点如何 之前使用 setOrigin 设置新的原点无效 我确信精灵会更早地获得正确的原点位置 即矩形的中心 My code
  • UIGestureRecognizers 的多个手势(iPhone、Cocos2d)

    我使用 Cocos2d 渲染精灵 并使用 UIGestureRecognizers 允许用户平移 旋转和缩放精灵 我使用如下代码单独工作 UIPinchGestureRecognizer pinchRecognizer UIPinchGes
  • 如何在android中对这行LayoutInflater.from()进行单元测试

    您好 我正在构建一个简单的 RecyclerView 适配器 并尝试测试适配器的所有方法 但 onCreateViewHolder 对我来说很困难 Override public NewsViewHolder onCreateViewHol
  • 具有 ViewModel 和行为的 Xamarin 视图

    我有一个视图 其中包含当前用户的用户配置文件 该视图包含一个视图模型 该模型具有与用户名或电子邮件地址等单个属性的双向绑定 该视图还有一个行为 它会验证输入并显示输入无效的错误 由于双向绑定 即使行为表明输入错误 视图模型也会更新值 我需要
  • 如何在 R 上使用 dodged geom_boxplot 为每个方面注释不同的值?

    我正在尝试使用组 填充 和构面向我的 ggplot 箱线图添加重要性星号 Using geom signif 我可以添加栏 例如 我也试图对躲避的箱线图做同样的事情 类似于 想象一下较小的线上方有显着性值 前一张图的代码 data libr
  • 如何处理错误然后立即脱离承诺链?

    所以我有一个 Express 应用程序 它使用中间件来解析 JSON POST 请求 然后填充req body目的 然后我有一个承诺链 它使用 Joi 根据模式验证数据 然后将其存储在数据库中 我想做的是检查这些进程之一后是否抛出错误 通过
  • 调试作为 Ajax 响应一部分的 JavaScript 代码

    所以在我的网站中 我使用jquery通过ajax来获取数据 作为 ajax 响应的一部分 一些 javascript 代码也会被执行 问题是如何在firebug或其他工具中调试这个javascript 这是我迄今为止的经验 放置调试器 不起
  • 设置overflow-x:hidden会添加垂直滚动条[重复]

    这个问题在这里已经有答案了 当我指定overflow x hidden在水平和垂直溢出的元素上 除了隐藏水平溢出的内容之外 该元素还会获得垂直滚动条 我尝试过添加overflow y visible甚至只是overflow visible
  • 如何修复警告:初始化程序周围缺少大括号?

    该警告是由vala 生成的c 代码产生的 警告 初始化程序周围缺少大括号 该代码可以工作 但警告很烦人 警告引用的vala代码是 struct Position uint x uint y private static Position p
  • 使用 jQuery FlexSlider 添加或删除幻灯片

    是否可以在运行时添加或删除幻灯片弹性滑块 http flex madebymufffin com 新版本的弹性滑块2 https github com woothemes FlexSlider已经支持这种方法了 slider addSlid
  • 如何让Service Worker离线工作?

    我无法让我的 Service Worker 离线工作 无论我使用什么教程 我在我的 index html 文件中注册了服务工作者 如下所示
  • 如何在可扩展列表视图上插入标题行

    我有一个带有一个可扩展列表视图的 Android 活动 然后我创建了 ExpandableListAdapter 因此我可以单击一个项目 然后可以看到该项目的子项目 还行吧 现在我想为每个项目的子列表插入标准标题 标题 所以我构建了这段代码
  • “返回的颜色将针对指定上下文的主题进行样式设置”是什么意思?

    我最近注意到一个方法 Context getResources getColor int 自 API 23 起已弃用 应该使用 ContextCompat getColor context R color your color 文档对此说道
  • 如何使用重命名重构作为快速修复的一部分?

    我在 DSL 中添加了一个快速修复选项 我想在其中对文档文本进行一些修改 包括重命名某些元素 我可以很好地更改该元素中的文本 但我还想重命名其所有引用 即重命名重构 我怎么做 我可以以某种方式从快速修复内部触发内置的重命名重构吗 或者 如何
  • Gtk-消息:无法加载模块“canberra-gtk-module”

    我的 pygtk 程序将此警告写入 stderr Gtk Message Failed to load module canberra gtk module 自由堪培拉 http 0pointer de lennart projects l
  • MKMapView 无法缩放地图

    我创建了一个非常基本的应用程序 仅显示 MKMapView 和 UserLocation 我有时在绘制这张底图时遇到问题 它只显示地图的一部分 每当我捏缩放地图时 它都无法重新绘制 而只显示空白的灰色图块 每当需要获取新的地图图块时 控制台
  • OpenCV 不报告准确的帧速率/计数

    我有一个 33 秒的视频 正在尝试使用 OpenCV 进行处理 我的目标是确定每个帧对应的时间实例 相对于视频的开始 我这样做是为了能够比较以不同帧速率录制的同一场景的视频帧 什么在起作用 FPS 正确报告为 59 75 这与什么是一致的f