2012-02-09 10 views
7

निम्नलिखित कोड त्रुटि संदेश पोस्ट करेंगे:opencv - अभिकथन cvCvtColor में विफल रहा है (dst.data == dst0.data)

// object is a color image with type cv::Mat 

IplImage* temp_object = &(IplImage)object; 
IplImage* ipl_object = cvCreateImage(cvGetSize(temp_object), 8, 3); 
assert(temp_object->nChannels == 3 && temp_object->depth == IPL_DEPTH_8U); 
assert(ipl_object->nChannels == 3 && ipl_object->depth == IPL_DEPTH_8U); 
cvCvtColor(ipl_object, temp_object, CV_BGR2GRAY); 

त्रुटि

OpenCV Error: Assertion failed (dst.data == dst0.data) in cvCvtColor, file /opt/local /var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.3.1/modules/imgproc/src/color.cpp, line 3175 terminate called throwing an exception`

अपडेट किया गया संशोधन के बाद कोड (अब यह काम करना चाहिए)। सहायता के लिए धन्यवाद!

IplImage temp_object (object); 
IplImage* ipl_object = cvCreateImage(cvGetSize(&temp_object), 8, 1); 
cvCvtColor(&temp_object, ipl_object, CV_BGR2GRAY); 

उत्तर

7
IplImage* temp_object = &(IplImage)object; 

है कि आप object के लिए सूचक नहीं देता है, IplImage के रूप में व्याख्या की; इसके बजाए, यह object से एक अस्थायी IplImage बनाता है, जो आपको इसके लिए एक सूचक देता है, और फिर अस्थायी को नष्ट कर देता है, temp_object छोड़कर कुछ भी मान्य नहीं है। बाद में temp_object का उपयोग अपरिभाषित व्यवहार देगा।

मैं पुस्तकालय से परिचित नहीं हूँ, लेकिन शायद आप object के लिए सूचक चाहते हैं (यदि IplImage जो कुछ भी प्रकार object है की एक उप-प्रकार है):

IplImage* temp_object = static_cast<IplImage *>(&object); 

एक डाली का उपयोग कर एक सूचक कन्वर्ट करने के लिए (या एक संदर्भ, यदि आप पसंद करते हैं), ऑब्जेक्ट स्वयं नहीं।

IplImage temp_object(object); 
+0

स्पष्टीकरण के लिए धन्यवाद। 'IplImage * temp_object = static_cast (& ऑब्जेक्ट); 'त्रुटि देगी' त्रुटि: 'cv :: Mat *' टाइप करने के लिए अमान्य static_cast 'IplImage *'' – LKS

+0

@ user1020390 टाइप करें: उस स्थिति में, शायद आप बनाना चाहते हैं एक नई वस्तु; आपको इसे एक नाम देने की जरूरत है ताकि यह अस्थायी न हो। मेरा संपादन देखें। –

+0

धन्यवाद। मुझे लगता है कि इसे अभी काम करना चाहिए। – LKS

4

एक और मुद्दा यह है कि CV_BGR2GRAY उम्मीद गंतव्य एक चैनल होने के लिए है, और तिगुना नहीं:

या हो सकता है कि आप एक नया (गैर अस्थायी) वस्तु चाहते हैं। इसके अलावा, cvCvtColor() का हस्ताक्षर एसआरसी और फिर डीएसटी के साथ शुरू होता है। आप संभवतः अपने कोड को कुछ समायोजित करना चाहते हैं जैसे:

IplImage* ipl_object = cvCreateImage(cvGetSize(temp_object), 8, 1); 
cvCvtColor(&object, ipl_object, CV_BGR2GRAY); 
+0

धन्यवाद! मैंने cvCvtColor में एक गलती की। आपकी सलाह सही है। यही वह है जो मैं करना चाहता हूं। जैसा कि मैंने ऊपर टिप्पणी की है, मैं temp_object को उचित प्रकार के साथ 'IplImage * temp_object = static_cast (& ऑब्जेक्ट) के साथ नहीं बना सकता; '। त्रुटि ने कहा कि यह अमान्य static_cast है। क्या मैंने कहीं गलती की? – LKS

+1

धन्यवाद। मुझे लगता है कि इसे अभी काम करना चाहिए। – LKS