OpenCV VideoCapture returns 不同版本的奇怪帧偏移
OpenCV VideoCapture returns strange frame offset for different versions
我正在使用 opencv-python
,当我执行以下代码时:
index = 0
cap = cv2.VideoCapture(video_path)
while True:
offset = cap.get(cv2.CAP_PROP_POS_MSEC)
print(cv2.__version__, index, offset)
ok, frame = cap.read()
if not ok:
break
index += 1
我得到以下输出:
3.4.7 0 0.0
3.4.7 1 33.36666666666667
3.4.7 2 66.73333333333333
3.4.7 3 100.10000000000001
3.4.7 4 133.46666666666667
如果我在版本 3.4.8.29
上执行此代码,我会得到以下输出:
3.4.8 0 0.0
3.4.8 1 0.0
3.4.8 2 33.36666666666667
3.4.8 3 66.73333333333333
3.4.8 4 100.10000000000001
如果我在 4.5.2.52
版本上执行它,我会得到:
4.5.2 0 0.0
4.5.2 1 0.0
4.5.2 2 0.0
4.5.2 3 0.0
4.5.2 4 0.0
首先问题是,哪一个是正确的?似乎 3.4.7 是正确的,但它似乎也在版本之间随机变化。
以及如何修改其他版本以获得正确的结果,与 3.4.7
相同
我读了 OpenCV 文档,他们说:“读/写属性涉及很多层。一些意想不到的结果可能会沿着这个链条发生。有效的行为取决于设备硬件、驱动程序和 API 后端。” (来源:https://docs.opencv.org/3.4.15/d4/d15/group__videoio__flags__base.html#gaeb8dd9c89c10a5c63c139bf7c4f5704d)
换句话说,OpenCV 不保证此函数的行为一致且可靠。
我还安装了 openCV 4.5.2.52 并将您的脚本应用到我的一个“.mp4”视频中。然后我得到了与 openCV 版本 3.4.8.29 相同的结果。所以我认为你遇到的行为不是'bug',而是这个函数的不可靠行为。
作为解决方法,您可以通过将帧数除以 FPS 计数来计算“偏移量”(请参见下面的代码)。这样您就可以更好地控制行为,并可能获得更一致的结果。
index = 0
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
while True:
offset = cap.get(cv2.CAP_PROP_POS_MSEC)
ok, frame = cap.read()
if not ok:
break
# CAP_PROP_POS_MSEC
print("CAP_PROP_POS_MSEC: ", index, offset)
# Devide fps by frame number
offset = cap.get(cv2.CAP_PROP_POS_FRAMES) / fps * 1000
print("cv2.CAP_PROP_POS_FRAMES", index, offset)
index += 1
我正在使用 opencv-python
,当我执行以下代码时:
index = 0
cap = cv2.VideoCapture(video_path)
while True:
offset = cap.get(cv2.CAP_PROP_POS_MSEC)
print(cv2.__version__, index, offset)
ok, frame = cap.read()
if not ok:
break
index += 1
我得到以下输出:
3.4.7 0 0.0
3.4.7 1 33.36666666666667
3.4.7 2 66.73333333333333
3.4.7 3 100.10000000000001
3.4.7 4 133.46666666666667
如果我在版本 3.4.8.29
上执行此代码,我会得到以下输出:
3.4.8 0 0.0
3.4.8 1 0.0
3.4.8 2 33.36666666666667
3.4.8 3 66.73333333333333
3.4.8 4 100.10000000000001
如果我在 4.5.2.52
版本上执行它,我会得到:
4.5.2 0 0.0
4.5.2 1 0.0
4.5.2 2 0.0
4.5.2 3 0.0
4.5.2 4 0.0
首先问题是,哪一个是正确的?似乎 3.4.7 是正确的,但它似乎也在版本之间随机变化。
以及如何修改其他版本以获得正确的结果,与 3.4.7
我读了 OpenCV 文档,他们说:“读/写属性涉及很多层。一些意想不到的结果可能会沿着这个链条发生。有效的行为取决于设备硬件、驱动程序和 API 后端。” (来源:https://docs.opencv.org/3.4.15/d4/d15/group__videoio__flags__base.html#gaeb8dd9c89c10a5c63c139bf7c4f5704d)
换句话说,OpenCV 不保证此函数的行为一致且可靠。
我还安装了 openCV 4.5.2.52 并将您的脚本应用到我的一个“.mp4”视频中。然后我得到了与 openCV 版本 3.4.8.29 相同的结果。所以我认为你遇到的行为不是'bug',而是这个函数的不可靠行为。
作为解决方法,您可以通过将帧数除以 FPS 计数来计算“偏移量”(请参见下面的代码)。这样您就可以更好地控制行为,并可能获得更一致的结果。
index = 0
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
while True:
offset = cap.get(cv2.CAP_PROP_POS_MSEC)
ok, frame = cap.read()
if not ok:
break
# CAP_PROP_POS_MSEC
print("CAP_PROP_POS_MSEC: ", index, offset)
# Devide fps by frame number
offset = cap.get(cv2.CAP_PROP_POS_FRAMES) / fps * 1000
print("cv2.CAP_PROP_POS_FRAMES", index, offset)
index += 1