OpenCV和Numpy的互动非常糟糕

Ben*_*Ben 15 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
Run Code Online (Sandbox Code Playgroud)

这是对的

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

导入cv后仍然可以

>>> import numpy
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
Run Code Online (Sandbox Code Playgroud)

导入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
Run Code Online (Sandbox Code Playgroud)

到目前为止这么好,但现在我导入cv AFTER导入numpy:

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

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

我无法理解如何导入numpy和cv对struct.unpack的输出有任何影响(包仍然是相同的,顺便说一句).

我认为,"libdc1394"是一个红鲱鱼:ctypes错误:libdc1394错误:无法初始化libdc1394

有任何想法吗?

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

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

Pau*_*ida 5

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

没有加载numpycv:

>>> unpack("f", pack("i", 8388608))
(1.1754943508222875e-38,)
>>> unpack("f", pack("i", 8388607))
(1.1754942106924411e-38,)
Run Code Online (Sandbox Code Playgroud)

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

>>> unpack("f", pack("i", 8388607))
(0.0,)
Run Code Online (Sandbox Code Playgroud)

您会注意到第一个结果是32位浮点数的下限.然后我尝试了相同的d.

无需加载库:

>>> unpack("d", pack("xi", 1048576))
(2.2250738585072014e-308,)
>>> unpack("d", pack("xi", 1048575))
(2.2250717365114104e-308,)
Run Code Online (Sandbox Code Playgroud)

加载库后:

>>> unpack("d",pack("xi", 1048575))
(0.0,)
Run Code Online (Sandbox Code Playgroud)

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

看起来由于某种原因,按顺序加载numpycv库约束unpack使用32位和64位精度,并返回0表示较低值.