[英]Converting cv::Mat to IplImage*
关于此的文档似乎非常参差不齐。
我基本上有一个 IplImage*s (IplImage** imageArray) 的空数组,我正在调用一个函数来导入一个 cv::Mats 数组 - 我想将我的 cv::Mat 转换为 IplImage* 所以我可以将其复制到数组中。
目前我正在尝试这个:
while(loop over cv::Mat array)
{
IplImage* xyz = &(IplImage(array[i]));
cvCopy(iplimagearray[i], xyz);
}
这会产生段错误。
也在尝试:
while(loop over cv::Mat array)
{
IplImage* xyz;
xyz = &array[i];
cvCopy(iplimagearray[i], xyz);
}
这给了我一个编译时错误: error: cannot convert 'cv::Mat*' to 'IplImage*' in assignment
不知道我如何才能走得更远,希望得到一些建议:)
cv::Mat
是 OpenCV2.X 中引入的新类型,而IplImage*
是“传统”图像结构。
尽管cv::Mat
确实支持在构造函数参数中使用IplImage
,但默认库不提供其他方式的功能。 您将需要手动提取图像标题信息。 (请记住,您需要分配 IplImage 结构,这在您的示例中是缺失的)。
Mat image1;
IplImage* image2=cvCloneImage(&(IplImage)image1);
猜猜这会完成这项工作。
编辑:如果您遇到编译错误,请尝试以下方法:
cv::Mat image1;
IplImage* image2;
image2 = cvCreateImage(cvSize(image1.cols,image1.rows),8,3);
IplImage ipltemp=image1;
cvCopy(&ipltemp,image2);
(you have cv::Mat old)
IplImage copy = old;
IplImage* new_image = ©
您将 new 作为最初声明的 IplImage* 使用。
这是最近针对 dlib 用户的修复链接
cv::Mat img = ...
IplImage iplImage = cvIplImage(img);
我个人认为这不是类型转换引起的问题,而是缓冲区溢出问题; 这是这条线
cvCopy(iplimagearray[i], xyz);
我认为会导致段错误,我建议您确认数组 iplimagearray[i] 有足够的缓冲区大小来接收复制的数据
根据 OpenCV备忘单,这可以按如下方式完成:
IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);
Mat newC = cvarrToMat(oldC0);
cv::cvarrToMat函数负责处理转换问题。
在灰度图像的情况下,我正在使用此功能并且效果很好! 但是你必须注意功能特性;)
CvMat * src= cvCreateMat(300,300,CV_32FC1);
IplImage *dist= cvCreateImage(cvGetSize(dist),IPL_DEPTH_32F,3);
cvConvertScale(src, dist, 1, 0);
一个问题可能是:当使用外部 ipl 并在您的项目中定义 HAVE_IPL 时,构造函数
_IplImage::_IplImage(const cv::Mat& m)
{
CV_Assert( m.dims <= 2 );
cvInitImageHeader(this, m.size(), cvIplDepth(m.flags), m.channels());
cvSetData(this, m.data, (int)m.step[0]);
}
在 ../OpenCV/modules/core/src/matrix.cpp 中找到未使用/实例化并且转换失败。
您可以以类似于以下方式重新实现它:
IplImage& FromMat(IplImage& img, const cv::Mat& m)
{
CV_Assert(m.dims <= 2);
cvInitImageHeader(&img, m.size(), cvIplDepth(m.flags), m.channels());
cvSetData(&img, m.data, (int)m.step[0]);
return img;
}
IplImage img;
FromMat(img,myMat);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.