opencv - cvCvtColor中的断言失败(dst.data == dst0.data)

时间:2012-02-09 13:26:02

标签: c++ image-processing opencv

以下代码将发布错误消息:

// 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错误:cvCvtColor中的断言失败(dst.data == dst0.data),文件/ 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,第3175行   终止叫做抛出异常`

修改后的更新代码(现在应该可以使用)。谢谢你的帮助!

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

2 个答案:

答案 0 :(得分:7)

IplImage* temp_object = &(IplImage)object;

这不会给你一个指向object的指针,重新解释为IplImage;相反,它从IplImage创建一个临时object,给你一个指针,然后销毁临时,让temp_object指向无效。之后使用temp_object会给出未定义的行为。

我不熟悉这个库,但是你想要一个指向object的指针(如果IplImageobject所属类型的子类型):

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

使用强制转换转换指针(或引用,如果您愿意),而不是对象本身。

或许你想要一个新的(非临时的)对象:

IplImage temp_object(object);

答案 1 :(得分:4)

另一个问题是CV_BGR2GRAY期望目的地是单个频道,而不是三频道。此外,cvCvtColor()的签名从SRC开始,然后是DST。您可能希望将代码调整为:

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