2012-02-09 19 views
7

il codice seguente inviare il messaggio di errore:OpenCV - Asserzione non riuscita (dst.data == dst0.data) in cvCvtColor

// 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); 

errore

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`

codice aggiornato dopo la modifica (dovrebbe funzionare ora). Grazie per l'aiuto!

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

risposta

7
IplImage* temp_object = &(IplImage)object; 

che non ti dà un puntatore a object, reinterpretata come IplImage; invece, crea uno IplImage temporaneo da object, fornisce un puntatore a tale e quindi distrugge il temporaneo, lasciando temp_object puntando a nulla di valido. L'utilizzo di temp_object in seguito darà un comportamento indefinito.

Non ho familiarità con la libreria, ma forse si vuole un puntatore a object (se IplImage è un sottotipo di qualsiasi tipo object è):

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

utilizzando un cast per convertire un puntatore (o un riferimento, se preferisci), non l'oggetto stesso.

o forse si desidera un nuovo (non temporanea) oggetto:

IplImage temp_object(object); 
+0

Grazie per la spiegazione. 'IplImage * temp_object = statico_cast (& oggetto);' emetterà 'errore: statico_cast non valido da tipo 'cv :: Mat *' per digitare 'IplImage *'' – LKS

+0

@ user1020390: In tal caso, forse si vuole fare un nuovo oggetto; devi dargli un nome in modo che non sia temporaneo. Vedi la mia modifica. –

+0

Grazie. Penso che dovrebbe funzionare ora. – LKS

4

altro problema è che CV_BGR2GRAY aspetta la destinazione da un singolo canale, e non triplicare. Inoltre, la firma di cvCvtColor() inizia con SRC e quindi DST. Probabilmente vorresti adattare il tuo codice a qualcosa del tipo:

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

Grazie! Ho fatto un errore in cvCvtColor. Il tuo consiglio è giusto. Questo è quello che intendo fare. Come ho anche commentato sopra, non posso creare temp_object con il tipo corretto con la riga 'IplImage * temp_object = static_cast (& oggetto);'. L'errore dice che non è valido static_cast. Ho sbagliato da qualche parte? – LKS

+1

Grazie. Penso che dovrebbe funzionare ora. – LKS

Problemi correlati