opencv - утверждение не удалось (dst.data == dst0.data) в cvCvtColor - PullRequest
7 голосов
/ 09 февраля 2012

Следующий код отправит сообщение об ошибке:

// 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: подтверждение не выполнено (dst.data == dst0.data) в файле cvCvtColor, файл / opt / local /var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.3.1/mo/countr_catel_procateg.proвыдает исключение`

Обновлен код после модификации (теперь он должен работать).Спасибо за помощь!

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

Ответы [ 2 ]

7 голосов
/ 09 февраля 2012
IplImage* temp_object = &(IplImage)object;

Это не дает вам указатель на object, интерпретируется как IplImage;вместо этого он создает временное IplImage из object, дает вам указатель на него, а затем уничтожает временное, оставляя temp_object, указывающее на ничто действительное.Использование temp_object впоследствии даст неопределенное поведение.

Я не знаком с библиотекой, но, возможно, вам нужен указатель на object (если IplImage является подтипом любого типа, object является):

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

с использованием приведения для преобразования указателя (или ссылки, если вы предпочитаете), а не самого объекта.

Или, возможно, вы хотите новый (не временный)объект:

IplImage temp_object(object);
4 голосов
/ 09 февраля 2012

Другая проблема заключается в том, что CV_BGR2GRAY ожидает, что пункт назначения будет одиночным, а не тройным.Кроме того, подпись cvCvtColor() начинается с SRC, а затем с DST.Вы, вероятно, хотите настроить свой код на что-то вроде:

IplImage* ipl_object = cvCreateImage(cvGetSize(temp_object), 8, 1);
cvCvtColor(&object, ipl_object, CV_BGR2GRAY);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...