繁体   English   中英

将 cv::Mat 转换为 IplImage*

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM