उदाहरण आप अनुकूलन करने की कोशिश की 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
पैरामीटर एक चैनल से जुड़े डेटा के बाइट्स में आकार है। आपके उदाहरण में, यह केवल छवि चौड़ाई (केवल एक चैनल, एक बाइट प्रति पिक्सेल) होगा।
कोड आप ऊपर बताए यह (cvSetData) में एक अपरिभाषित नाम है, तो यह है यह जानना मुश्किल है कि आपने वास्तव में कोशिश की है या नहीं। –
@ जोनाथन: मुझे आपके द्वारा उल्लिखित त्रुटि नहीं मिली है। cvSetData वास्तव में opencv.cv – Arkady
में परिभाषित एक वैध फ़ंक्शन है, वर्तमान में उत्तर की स्थिति क्या है? –