2013-08-28 74 views
15

任何人都可以解釋爲什麼導入cv和numpy會改變python的struct.unpack的行爲?這是我觀察到:OpenCV和Numpy交互不好

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 

還OK,進口品種

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

後確定進口的簡歷後,然後numpy的

現在我重新啓動蟒蛇:

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 

到目前爲止好,但現在我的簡歷導入後導入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的輸出產生任何影響(包仍然是相同的,順便說一句)。

的 「libdc1394」 的事情是,我認爲,紅鯡魚:ctypes error: libdc1394 error: Failed to initialize libdc1394

任何想法?

tl; dr:導入numpy,然後opencv改變struct.unpack的行爲。

更新:Paulo的回答如下表明這是可重現的。 Seborg的評論表明,這與python處理次正常的方式有關,這聽起來似乎合理。我調查了Contexts,但這似乎並不是問題,因爲在進口之後的情況與之前一樣。

+2

這不會對你有所幫助,但是爲了可讀性和簡化問題,'unpack(「f」,pack(「I」,31))「產生相同的結果嗎? –

+0

@PauloAlmeida:好點。剛剛嘗試過 - 是的,結果相同...我將編輯問題以使其更易於閱讀... – Ben

回答

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。

+0

感謝Paulo--很高興看到這不僅僅是我! :-) – Ben

+0

@Ben沒問題:)如果你還沒有測試Python 3,因爲它看起來像CV檢查它,並且定義了不同的東西。另外,如果你在numpy的\ _ \ _ init \ _ \ _。py中註釋每一行,行爲就會消失(至少在我的系統中進行了快速測試),但我沒有進一步調查。 –

+0

我認爲這與低於正常的數字處理有關。結構的結果似乎已經將最小合法浮點數/雙精度浮點數倒過來(是否真的應該發生?)。不知道如何四捨五入標誌的CPU工作,但我猜測簡歷會改變一些標誌如何四捨五入。 – seberg