2013-08-28 4 views
15

क्या कोई यह समझा सकता है कि सीवी और numpy आयात क्यों पाइथन की 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 

फिर भी ठीक है, सीवी आयात करने

>>> 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 के व्यवहार को बदलता है।

अद्यतन: नीचे पाउलो का जवाब दिखाता है कि यह पुनरुत्पादित है। सेबॉर्ग की टिप्पणी से पता चलता है कि पाइथन उपनिवेशों को संभालने के तरीके से कुछ करना है, जो व्यावहारिक लगता है। मैंने Contexts में देखा लेकिन यह समस्या नहीं प्रतीत होती, क्योंकि संदर्भ आयात के बाद ही था जैसा कि उनके सामने था।

+2

यह आपको मदद करने के लिए नहीं जा रहा है, लेकिन सिर्फ पठनीयता के कारण और समस्या को सरल बनाने, 'खोल करता है (" f ", पैक (" मैं ", 31))' एक ही परिणाम का उत्पादन? –

+0

@PauloAlmeida: अच्छा बिंदु। बस कोशिश की - हाँ, वही परिणाम ... मैं इसे पढ़ने में आसान बनाने के लिए प्रश्न संपादित करूँगा ... – Ben

उत्तर

5

यह कोई जवाब नहीं है, लेकिन यह एक टिप्पणी के लिए बहुत बड़ा है। मैंने सीमाओं को खोजने के लिए मूल्यों के साथ थोड़ा सा खेला।

लोड हो रहा है numpy और cv के बिना:

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

numpy और cv, पहली पंक्ति में एक ही है, लेकिन पीछे नहीं है लोड करने के बाद:

>>> 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 बिट फ्लोट परिशुद्धता के लिए निचली सीमा है।

ऐसा लगता है कि किसी कारण से, numpy और cv पुस्तकालयों लोड हो रहा है, इसी क्रम में, रोकें unpack 32 और 64 बिट परिशुद्धता का उपयोग करें और कम मूल्यों के लिए 0 वापस जाने के लिए।

+0

धन्यवाद पाउलो - यह देखना अच्छा है कि यह सिर्फ मुझे नहीं है! :-) – Ben

+0

@Ben कोई समस्या नहीं है :) क्या परीक्षण अजगर 3 अगर आप अभी तक नहीं है, क्योंकि यह इसके लिए सीवी चेकों लगता है और अलग ढंग से चीजों को परिभाषित करता है। इसके अलावा, आप numpy के \ _ \ _ init \ _ \ _ में हर पंक्ति टिप्पणी करता है, तो। PY (कम से कम एक त्वरित परीक्षण मैंने किया था में अपने सिस्टम पर) व्यवहार चली जाती है, लेकिन मैं आगे की जांच नहीं की। –

+0

मुझे लगता है कि यह असामान्य संख्या संभाल के साथ करना है। struct परिणाम पहले से ही छोटी से छोटी कानूनी नाव सामान्य से कम को ख़त्म कर रहा है/डबल (जाता है कि वास्तव में क्या होने चाहिए?)। निश्चित नहीं है कि सीपीयू के काम में घूमने वाले झंडे कैसे हैं, लेकिन मुझे लगता है कि सीवी कुछ झंडे बदलता है कि चीजें कैसे घूमती हैं। – seberg

संबंधित मुद्दे