2012-10-27 40 views
5

नए OpenCV प्रलेखन here कहते हैं कि आप एक Numpy सरणी सिर्फ इस तरह के लिए एक IplImage परिवर्तित कर सकते हैं:तेजी से रूपांतरण

arr = numpy.asarray(im) 

लेकिन यह है कि, मेरी जरूरतों के लिए काम नहीं करता है, क्योंकि यह जाहिरा तौर पर नहीं करता है 'टी समर्थन गणित:

x = arr/0.01 
TypeError: unsupported operand type(s) for /: 'cv2.cv.iplimage' and 'float' 

अगर मैं डेटा प्रकार निर्दिष्ट करने के लिए प्रयास करते हैं, मैं भी कि नहीं अब तक प्राप्त कर सकते हैं:

arr = numpy.asarray(im, dtype=num.float32) 
TypeError: float() argument must be a string or a number 

तो मैं पुराने दस्तावेज here में दिए गए कोड का उपयोग कर रहा हूं। असल में, यह इस करता है:

arr = numpy.fromstring(im.tostring(), dtype=numpy.float32) 

लेकिन tostring कॉल वास्तव में धीमी है, शायद इसलिए क्योंकि यह डेटा की प्रतिलिपि है? मुझे इस रूपांतरण की वास्तव में तेज़ी से आवश्यकता है और किसी भी बफर की प्रतिलिपि बनाने की आवश्यकता नहीं है जिसकी आवश्यकता नहीं है। मुझे नहीं लगता कि डेटा स्वाभाविक रूप से असंगत है; मैं अपनी आईपीएल छवि को पहले स्थान पर cv.fromarray के साथ बना रहा हूं, जो ओपनसीवी कार्यों द्वारा बेहद तेज़ और स्वीकार्य है।

क्या कोई तरीका है कि मैं अपने लिए asarray विधि का काम कर सकता हूं, या फिर मैं आईपीएलमेज में डेटा पॉइंटर तक सीधे पहुंच प्राप्त कर सकता हूं जिस तरह से numpy.fromstring इसे स्वीकार करेगा? मैं उबंटू सटीक के लिए ओपनसीवी 2.3.1 प्रीपेक किए गए का उपयोग कर रहा हूं।

+0

ओपनसीवी भारी विकास के तहत है, पाइथन बाइंडिंग भी है। आपको पहले OpenCV 2.4.2 या 2.4.3rc आज़माएं। – ypnos

+0

सवाल मान्य है। OpenCV 'cv' bindgins के लिए पहले से ही कुछ विरासत पायथन कोड है। वे अभी भी ओपनसीवी 2.4.2 के रूप में समर्थित हैं। उन्हें 'cv2' में कनवर्ट करना हमेशा एक विकल्प नहीं हो सकता है। – sastanin

उत्तर

9

मज़ा तथ्य:
आप कॉल कहते हैं:

import cv2.cv as cv #Just a formality! 

Capture = cv.CaptureFromCAM(0) 
Img = cv.QueryFrame(Capture) 

वस्तु Img एक ipimage है, और numpy.asarray(Img) अनियमित पर सबसे अच्छा है। तथापि! Img[:,:]cvmat प्रकार है, और numpy.asarray(Img[:,:]) शानदार काम करता है, और अधिक महत्वपूर्ण: जल्दी!

यह एक फ्रेम पकड़ने के लिए सबसे तेज़ तरीका है और इसे ndarray को numpy प्रोसेसिंग के लिए बना देता है।

+0

बहुत बढ़िया, मैं कोशिश करूँगा। दुर्भाग्यवश, यह जल्द ही नहीं होगा। – jab

+0

धन्यवाद! यह बहुत अच्छा काम करता है। –

0

वह पृष्ठ IplImage के बारे में नहीं कहता है। यह CvMat के बारे में बताता है जो अलग है।

वैसे भी आप बेहतर cv2 नामस्थान से रैपर का बेहतर उपयोग करेंगे। यह मूल रूप से अपने छवि कंटेनर के बजाय numpy arrays का उपयोग करता है। इसके अलावा पूरे cv मॉड्यूल को बहिष्कृत माना जाता है और निकटतम प्रमुख रिलीज में पूरी तरह से गिरा दिया जाएगा।

+1

आपका मतलब है कि मुझे 'cv2.fromarray()' या ऐसा कुछ उपयोग करना चाहिए, और फिर 'numpy.asarray() 'जादुई रूप से काम करेगा? क्या आप दस्तावेज़ों के लिए एक लिंक प्रदान कर सकते हैं? – jab

+0

इसके अलावा, कैसे * # @ $ किसी को यह जानना था? मैं संस्करण 0.1 के बाद से ओपनसीवी का उपयोग कर रहा हूं, और मैं हमेशा चिल्लाना दूर चला जाता हूं। यह एक डरावनी फिल्म की तरह है - मुझे डर है कि दरवाजे के पीछे एक राक्षस होगा, लेकिन मैं इसे वैसे भी खोलता हूं। – jab

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