2012-02-09 21 views
7

el siguiente código publicar el mensaje de error:OpenCV - aserción (dst.data == dst0.data) en 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); 

error

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`

código actualizado después de la modificación (debería funcionar ahora). ¡Gracias por la ayuda!

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

Respuesta

7
IplImage* temp_object = &(IplImage)object; 

Eso no le da un puntero a object, reinterpretados como IplImage; en su lugar, crea un IplImage temporal desde object, le da un puntero a eso y luego destruye el temporal, dejando temp_object apuntando a nada válido. Usar temp_object posteriormente dará un comportamiento indefinido.

No estoy familiarizado con la biblioteca, pero tal vez quiero un puntero a object (si IplImage es un subtipo del tipo que sea object es):

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

utilizando un molde para convertir un puntero (o una referencia, si lo prefiere), no el objeto en sí.

O tal vez quiere un nuevo objeto (no temporal):

IplImage temp_object(object); 
+0

Gracias por la explicación. 'IplImage * temp_object = static_cast (& object);' will give out 'error: static_cast no válido del tipo' cv :: Mat * 'para escribir' IplImage * '' – LKS

+0

@ user1020390: En ese caso, quizás quiera hacer un nuevo objeto; necesitas darle un nombre para que no sea temporal. Ver mi edición –

+0

Gracias. Creo que debería funcionar ahora. – LKS

4

Otra cuestión es que CV_BGR2GRAY espera que el destino sea un solo canal, y no triple. Además, la firma de cvCvtColor() comienza con SRC y luego DST. Probablemente desee ajustar su código a algo como:

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

¡Gracias! Cometí un error en cvCvtColor. Tu consejo es correcto. Eso es lo que pretendo hacer. Como también comenté anteriormente, no puedo crear temp_object con el tipo apropiado con la línea 'IplImage * temp_object = static_cast (& object);'. El error dice que no es válido static_cast. ¿Me equivoqué en algún lado? – LKS

+1

Gracias. Creo que debería funcionar ahora. – LKS