微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有 cv2.VideoCapture.set() 的替代函数吗?

如何解决有 cv2.VideoCapture.set() 的替代函数吗?

我正在使用线分析器测试我的算法的代码性能 class B { public : void fun() { cout<<"class B\n"; } }; class C { public : void fun() { cout<<"Class C\n"; } }; class D:public B,public C { public : void funD() { cout<<"Class D\n"; } };

%lprun -f track()

并惊讶于 Timer unit: 1e-06 s (µs) Total time: 1724.82 s Line # Hits Time Per Hit % Time Line Contents ============================================================== 138 1 35075.0 35075.0 0.0 video = cv2.VideoCapture(input_video_path) 139 1 6.0 6.0 0.0 frame_i = 0 142 143 927 4004.0 4.3 0.0 for img in frames: 144 926 294117.0 317.6 0.0 print('Percentage of video processed : {}'.format(round( (currentFrame / total) * 100,2))) 145 # capture frame-by-frame 146 926 545906580.0 589531.9 31.7 video.set(1,currentFrame); 147 # ret,img = video.read() 148 926 9046.0 9.8 0.0 frame_i += 1 占用了 31.7% 的时间(545.9 秒)。
这个功能到底有什么作用,有没有替代品可以节省大约 9 分钟的时间?
编辑这里是整个code和线分析器

解决方法

set(1,...) 表示 cv.CAP_PROP_POS_FRAMES。您应该使用命名常量,而不是幻数。

这在视频文件中称为“寻找”。

在视频文件中查找成本很高,因为必须找到最近的前一个关键帧,然后解码可能的多个帧,直到找到所需的点。任何图书馆都必须付出努力。这不是 OpenCV 的错。

如果您希望尽可能快,则必须将视频转码为仅内部格式。然后,只需要解码特定帧。您可以使用没有 B 帧或 P 帧(仅 I 帧)的 H.264,或者您可以使用 MJPEG。

一般来说,您应该避免寻求。逐帧阅读视频,不要跳来跳去,甚至不要“到下一帧”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。