Python / Opencv Float在转换时转换为不正确的Int

时间:2016-10-27 14:09:54

标签: python opencv numpy floating-accuracy

我正在使用OpenCV + Python自动在几个视频上添加叠加图像。在大多数情况下,我的代码工作正常,除了从给定的输入视频中收集一些启发式方法。我使用OpenCV VideoCapture.Get()函数收集视频的帧数和FPS,然后分别存储到变量。结果数字是float值,然后我将其转换为int,但这里存在问题:值减1!

此处的完整代码段:

import cv2 as cv

inputnm = "testVideo.mp4"

# Load the video into memory
camera = cv.VideoCapture(inputnm)

# Get important heuristics
fps = camera.get(cv.CAP_PROP_FPS)
maxFrames = camera.get(cv.CAP_PROP_FRAME_COUNT)

print type(fps), type(maxFrames)
print fps,maxFrames
print int(fps), int(maxFrames)
quit()

这会产生输出:

<type 'float'> <type 'float'>
60.0 401.0
59 400

有人可以向我解释这个原因吗?我尝试将其转换为numpy.float128然后再转换为numpy.unit8,但它仍然会将值降低一个。奇怪。

2 个答案:

答案 0 :(得分:2)

你刚刚看到了浮点的奇迹。

Python将数字显示为从浮点开始的对话的精确度,这通常对于可视化来说足够精确,在很多情况下也用于计算,但在像你这样的情况下,精度是不够的。

使用round(maxFrames)

答案 1 :(得分:1)

基本上发生的事情是你的浮点变量显示为60,但实际上它可能是59并且有些变化。它不会显示为59,因为python足够聪明,为了我们的缘故(59.99999 .. = 60)。当你转换为int时,你将截断59的小数,这似乎会使值减1(59.9999 =&gt; 59)。

编辑:与其他用户建议的一样,round(maxFrames)会将值四舍五入到最接近的整数。然后你可以转换为int并获得正确的结果。