问题及解决方案
在Python环境下,以往一直使用pip安装的方式安装的OpenCV。
pip install opencv-python
没有注意以此方式安装的并不是官方版,而是一个个人维护的库。
作者其实也写明了这是一个“Unofficial pre-built OpenCV packages for Python.”,只是一直觉得安装着方便,没有注意这一点。
直到前些阵子发现使用cv2.VideoCapture()
函数时,针对同一视频,不同版本的OpenCV读出来的视频帧数不一致,特别是某一版本读出来要少将近100帧。觉得这事情不简单,于是开始找问题。
找到OpenCV的GitHub下,issues里面有人也问到了这个问题:
然后看到代码维护者在下面评论说:
也就是说通过pip install opencv-python
命令安装的Python版OpenCV并非是官方支持的包,可能误差就是这个导致的。
于是开始做实验对比,发现以pip方式安装的opencv-python,在不同的版本下读出来的视频帧数可能不一致,而且某些情况下可能会出现缺少上百帧的问题。
这对实际的应用来说可是不能容忍的,于是果断卸载这种方式安装的包,转向根据官网安装指南通过源码安装OpenCV-Python。
再次测试发现视频帧数读取正常了。
以pip方式安装的opencv-python,在某台机器上的版本是4.3.0.38,读出来的视频少100来帧;版本换到4.2.0.34后,读出来的视频少5帧左右。升级到最新的4.4.0.42后,视频帧数读取正常了。
以源码方式安装的OpenCV-Python, 版本4.4.0.42,读出来的视频帧数最多最完整,与用ffmpeg命令读取出的视频帧数一致。
结论:要保证稳定性,还是建议用官方原版!
参考资料
[1] pypi: opencv-python 4.4.0.42
[2] GitHub OpenCV: VideoCapture.read drop the last few frames #16576
[3] Install OpenCV-Python in Ubuntu