2009-10-30 24 views
10

मैं OpenCV (अजगर में) के साथ कुछ छवि प्रसंस्करण क्या करना चाहते हैं, लेकिन मैं एक जनहित याचिका Image वस्तु के साथ शुरू कर दिया है, तो मैं, cvLoadImage() कॉल उपयोग नहीं कर सकते क्योंकि यह एक फ़ाइल नाम लेता है।मैं पीआईएल छवि से ओपनसीवी छवि कैसे बना सकता हूं?

यह नुस्खा (http://opencv.willowgarage.com/wiki/PythonInterface से अनुकूलित) काम नहीं करता है क्योंकि cvSetData शिकायत argument 2 of type 'void *' है। कोई विचार?

from opencv.cv import * 
from PIL import Image 

pi = Image.open('foo.png')      # PIL image 
ci = cvCreateImage(pi.size, IPL_DEPTH_8U, 1)  # OpenCV image 
data = pi.tostring() 
cvSetData(ci, data, len(data)) 

मुझे लगता है कि cvSetData को अंतिम तर्क भी गलत नहीं है, लेकिन मुझे यकीन है कि यह क्या किया जाना चाहिए नहीं कर रहा हूँ।

+1

कोड आप ऊपर बताए यह (cvSetData) में एक अपरिभाषित नाम है, तो यह है यह जानना मुश्किल है कि आपने वास्तव में कोशिश की है या नहीं। –

+0

@ जोनाथन: मुझे आपके द्वारा उल्लिखित त्रुटि नहीं मिली है। cvSetData वास्तव में opencv.cv – Arkady

+0

में परिभाषित एक वैध फ़ंक्शन है, वर्तमान में उत्तर की स्थिति क्या है? –

उत्तर

8

उदाहरण आप अनुकूलन करने की कोशिश की OpenCV 2.0 के लिए नई अजगर इंटरफ़ेस के लिए है। यह शायद पूर्वनिर्धारित और गैर-प्रीफ़िक्स्ड फ़ंक्शन नामों के बीच भ्रम का स्रोत है (cv.cvSetData() बनाम cv.SetData())।

दो अजगर बाइंडिंग के सेट के साथ

OpenCV 2.0 अब जहाजों:

  • "old-style" python wrapper, opencv.{cv,highgui,ml} मॉड्यूल
  • new interface के साथ एक अजगर पैकेज, एक अजगर सी एक्सटेंशन (cv.pyd), सभी OpenCV लपेटता जो कार्यक्षमताओं (highgui और ml मॉड्यूल भी शामिल है।)

त्रुटि संदेश के पीछे कारण यह है कि बड़ा घूँट चादर प्रति एक पायथन स्ट्रिंग से एक सादे पुराने सी बफर में रूपांतरण संभाल नहीं करता है। हालांकि, बड़ा घूँट आवरण opencv.adaptors मॉड्यूल है, जो OpenCV को numpy और PIL छवियों से होने वाले रूपांतरण का समर्थन करने के लिए बनाया गया है के साथ आता है।

निम्नलिखित (परीक्षण किया) कोड, अपने मूल समस्या (OpenCV के लिए जनहित याचिका से रूपांतरण) का समाधान करना चाहिए बड़ा घूँट इंटरफ़ेस का उपयोग:

# PIL to OpenCV using the SWIG wrapper 
from opencv import cv, adaptors, highgui 
import PIL 

pil_img = PIL.Image.open(filename) 

cv_img = adaptors.PIL2Ipl(pil_img) 

highgui.cvNamedWindow("pil2ipl") 
highgui.cvShowImage("pil2ipl", cv_img) 

हालांकि, इस तथ्य यह है कि cv.cvSetData() समारोह हमेशा असफल हो जायेगी समाधान नहीं करता है (वर्तमान एसडब्ल्यूआईजी रैपर कार्यान्वयन के साथ)। फिर आप नई शैली आवरण है, जो आप cv.SetData() समारोह का उपयोग करने के रूप में आप उम्मीद करेंगे की अनुमति देता है इस्तेमाल कर सकते हैं:

# PIL to OpenCV using the new wrapper 
import cv 
import PIL 

pil_img = PIL.Image.open(filename)  

cv_img = cv.CreateImageHeader(pil_img.size, cv.IPL_DEPTH_8U, 3) # RGB image 
cv.SetData(cv_img, pil_img.tostring(), pil_img.size[0]*3) 

cv.NamedWindow("pil2ipl") 
cv.ShowImage("pil2ipl", cv_img) 

एक तीसरा दृष्टिकोण ctypes-based wrapper करने के लिए अपने OpenCV अजगर इंटरफ़ेस स्विच करने के लिए किया जाएगा। यह स्पष्ट डेटा रूपांतरण के लिए उपयोगिता कार्यों के साथ आता है उदा। पायथन तार और सी बफर। google code search पर एक त्वरित नज़र से संकेत मिलता है कि यह एक कामकाजी विधि है।

cvSetData() समारोह के तीसरे पैरामीटर, छवि बफर के आकार, लेकिन छवि कदम के संबंध में। चरण आपकी छवि की एक पंक्ति में बाइट्स की संख्या है, जो pixel_depth * number_of_channels * image_width है। pixel_depth पैरामीटर एक चैनल से जुड़े डेटा के बाइट्स में आकार है। आपके उदाहरण में, यह केवल छवि चौड़ाई (केवल एक चैनल, एक बाइट प्रति पिक्सेल) होगा।

+0

@sevas: मैंने आपका उत्तर स्वीकार नहीं किया है (अभी तक), क्योंकि मैं ओपनसीवी के संस्करण 2.0 का उपयोग कर रहा हूं। जिस पेज से मैंने लिंक किया था, उस पर नुस्खा तब तक काम नहीं करता जब तक कि मैंने सीवी को बदल दिया। क्रिएट इमेज हैडर को cvCreateImage और cv.SetData को cvSetData में, इसलिए मैं अभी भी इसके बारे में उलझन में हूं। मैं ctypes-opencv के साथ अपने दृष्टिकोण की कोशिश करने जा रहा हूं और यदि यह काम करता है तो मैं यहां अपने निष्कर्ष पोस्ट करूंगा। – Arkady

+0

@ स्किबल: मैंने ओपनसीवी 2.0 के साथ बाइंडिंग शिपिंग के दो समवर्ती सेटों के बारे में जानकारी जोड़ा। हालांकि मैं शायद एक बेहतर समाधान की तलाश जारी रखूंगा। –

+0

@scrible: मैंने नवीनतम जानकारी का उपयोग करके जवाब अपडेट किया (विशेष रूप से, अनुकूलक मॉड्यूल और पायथन बाइंडिंग के दो सेट।) –

4

यह वास्तव में दोनों बड़ा घूँट और नए अजगर बाध्यकारी है करने के लिए भ्रमित कर रहा है। उदाहरण के लिए, ओपनसीवी 2.0 में, सेमेक BUILD_SWIG_PYTHON_SUPPORT और BUILD_NEW_PYTHON_SUPPORT दोनों को स्वीकार कर सकता है। लेकिन वैसे भी, मैंने थोड़ी सी परेशानियों को समझ लिया।

"आयात सीवी" (नया अजगर बाध्यकारी) का उपयोग कर के मामले में, एक और कदम की जरूरत है।

आरजीबी छवियों के लिए रूपांतरण आवश्यक है क्योंकि अनुक्रम पीआईएल और आईपीएल इमेज में अलग है। पीआईएल को आईपीएल पर भी लागू होता है।

लेकिन यदि आप opencv.adaptors का उपयोग करते हैं, तो इसकी पहले से ही देखभाल की जा चुकी है। रुचि रखते हैं तो आप adaptors.py में विवरण देख सकते हैं।

3

मैं इस OpenCV2.1 की python2.6 बाइंडिंग का उपयोग कर किया:

... 
    cv_img = cv.CreateImageHeader(img.size, cv.IPL_DEPTH_8U, 3) 
    cv.SetData(cv_img, img.rotate(180).tostring()[::-1]) 
    ... 

छवि रोटेशन और स्ट्रिंग के प्रत्यावर्तन बीजीआर में आरजीबी स्वैप करने के लिए है, कि OpenCV वीडियो एन्कोडिंग में प्रयोग किया जाता है। मुझे लगता है कि यह पीआईएल से ओपनसीवी में परिवर्तित छवि के किसी भी अन्य उपयोग के लिए भी आवश्यक होगा।

0

मैं एक विशेषज्ञ नहीं हूँ, लेकिन मैं इस कोड के साथ एक जनहित याचिका छवि से एक opencv छवि पाने में कामयाब रहे:

import opencv 

img = opencv.adaptors.PIL2Ipl(pilimg) 
संबंधित मुद्दे