关于此的文档似乎非常不稳定。
我基本上得到了一个空的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
坚持如何进一步发展,并希望得到一些建议:)
答案 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);