opencv - cvCvtColor 中的断言失败(dst.data == dst0.data)
Posted
技术标签:
【中文标题】opencv - cvCvtColor 中的断言失败(dst.data == dst0.data)【英文标题】:opencv - Assertion failed (dst.data == dst0.data) in cvCvtColor 【发布时间】:2012-02-09 13:26:02 【问题描述】:以下代码将发布错误消息:
// 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);
【问题讨论】:
【参考方案1】: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);
【讨论】:
感谢您的解释。IplImage* temp_object = static_cast<IplImage *>(&object);
将给出error: invalid static_cast from type 'cv::Mat*' to type 'IplImage*'
@user1020390:在这种情况下,也许您确实想创建一个新对象;你需要给它一个名字,这样它就不是临时的。查看我的编辑。【参考方案2】:
另一个问题是CV_BGR2GRAY
期望目的地是单通道,而不是三通道。此外,cvCvtColor()
的签名以 SRC 开头,然后是 DST。您可能希望将代码调整为:
IplImage* ipl_object = cvCreateImage(cvGetSize(temp_object), 8, 1);
cvCvtColor(&object, ipl_object, CV_BGR2GRAY);
【讨论】:
谢谢!我在 cvCvtColor 中犯了一个错误。你的建议是对的。这就是我打算做的。正如我在上面所评论的,我无法使用IplImage* temp_object = static_cast<IplImage *>(&object);
行创建具有正确类型的 temp_object。错误说它是无效的static_cast。我是不是在某个地方弄错了?以上是关于opencv - cvCvtColor 中的断言失败(dst.data == dst0.data)的主要内容,如果未能解决你的问题,请参考以下文章
opencv中cvCvtColor能实现yuv到rgb转换吗
《学习opencv》笔记——矩阵和图像操作——cvCrossProduct and cvCvtColor