将cv :: Mat转换为IplImage *

时间:2011-01-12 00:20:48

标签: c++ opencv

关于此的文档似乎非常不稳定。

我基本上得到了一个空的IplImage *数组(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

坚持如何进一步发展,并希望得到一些建议:)

8 个答案:

答案 0 :(得分:22)

cv::Mat是在OpenCV2.X中引入的新类型,而IplImage*是“遗留”图像结构。

虽然cv::Mat支持在构造函数参数中使用IplImage,但默认库不提供其他方式的函数。您需要手动提取图像标题信息。 (请记住,您需要分配IplImage结构,这在您的示例中是不足的。)

答案 1 :(得分:18)

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);

答案 2 :(得分:11)

 (you have cv::Mat old)
 IplImage copy = old;
 IplImage* new_image = ©

你使用new作为最初声明的IplImage *。

答案 3 :(得分:5)

这是dlib用户link的最新修复程序

cv::Mat img = ...
IplImage iplImage = cvIplImage(img);

答案 4 :(得分:1)

Personaly我认为这不是类型转换引起的问题,而是缓冲区溢出问题;这是这条线

cvCopy(iplimagearray[i], xyz);   

我认为会导致段错误,我建议您确认数组iplimagearray [i]有足够大的缓冲区来接收复制数据

答案 5 :(得分:0)

根据OpenCV cheat-sheet,可以按照以下方式完成:

IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);
Mat newC = cvarrToMat(oldC0);

cv::cvarrToMat功能会处理转换问题。

答案 6 :(得分:0)

如果是灰色图像,我正在使用此功能,它工作正常!但是你必须注意功能特性;)

CvMat * src=  cvCreateMat(300,300,CV_32FC1);      
IplImage *dist= cvCreateImage(cvGetSize(dist),IPL_DEPTH_32F,3);

cvConvertScale(src, dist, 1, 0);

答案 7 :(得分:0)

一个问题可能是:使用外部IPL并在项目中定义HAVE_IPL时,ctor

_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);