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 的指针(如果 IplImageobject 的任何类型的子类型):

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

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

或者您可能想要一个新的(非临时)对象:

IplImage temp_object(object);

【讨论】:

感谢您的解释。 IplImage* temp_object = static_cast&lt;IplImage *&gt;(&amp;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&lt;IplImage *&gt;(&amp;object); 行创建具有正确类型的 temp_object。错误说它是无效的static_cast。我是不是在某个地方弄错了?

以上是关于opencv - cvCvtColor 中的断言失败(dst.data == dst0.data)的主要内容,如果未能解决你的问题,请参考以下文章

opencv中cvCvtColor函数在哪个库

opencv中cvCvtColor能实现yuv到rgb转换吗

《学习opencv》笔记——矩阵和图像操作——cvCrossProduct and cvCvtColor

OpenCV3.0下 cvCvtColor函数灰度化图像遇到问题及解决办法

OpenCV 错误:输入参数的大小不匹配

Mat OpenCV 中的断言失败