OpenCV和Numpy的互动非常糟糕

时间:2013-08-28 15:05:36

标签: python opencv numpy

任何人都可以解释为什么导入cv和numpy会改变python的struct.unpack的行为吗?这是我观察到的:

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from struct import pack, unpack
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44

这是正确的

>>> import cv
libdc1394 error: Failed to initialize libdc1394
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44

导入cv后仍然可以

>>> import numpy
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44

导入cv然后numpy

后确定

现在我重新启动python:

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from struct import pack, unpack
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
>>> import numpy
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44

到目前为止一切顺利,但现在我导入cv AFTER导入numpy:

>>> import cv
libdc1394 error: Failed to initialize libdc1394
>>> unpack("f",pack("I",31))[0]
0.0

我已多次重复此操作,包括在多台服务器上,并且它总是以相同的方式。我也尝试过使用struct.unpack和struct.pack,这也没什么区别。

我无法理解导入numpy和cv对struct.unpack的输出有什么影响(pack保持不变,顺便说一句)。

我相信“libdc1394”的东西是红鲱鱼:ctypes error: libdc1394 error: Failed to initialize libdc1394

有什么想法吗?

tl; dr:导入numpy然后opencv改变了struct.unpack的行为。

更新:Paulo的回答显示这是可重复的。 Seborg的评论表明,它与python处理次正规的方式有关,听起来似乎有道理。我查看了Contexts,但这似乎不是问题,因为进口后的情境与之前的情况相同。

1 个答案:

答案 0 :(得分:5)

这不是一个答案,但它对于评论来说太大了。我玩了一些值来找到限制。

不加载numpycv

>>> unpack("f", pack("i", 8388608))
(1.1754943508222875e-38,)
>>> unpack("f", pack("i", 8388607))
(1.1754942106924411e-38,)

加载numpycv后,第一行是相同的,但第二行是:

>>> unpack("f", pack("i", 8388607))
(0.0,)

您会注意到第一个结果是lower limit for 32 bit floats。然后我尝试使用d

不加载库:

>>> unpack("d", pack("xi", 1048576))
(2.2250738585072014e-308,)
>>> unpack("d", pack("xi", 1048575))
(2.2250717365114104e-308,)

加载库后:

>>> unpack("d",pack("xi", 1048575))
(0.0,)

现在第一个结果是64位浮点精度的下限。

似乎由于某种原因,按顺序加载numpycv库,约束unpack使用32位和64位精度,并为较低值返回0。 / p>