如何解决有 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 举报,一经查实,本站将立刻删除。