将cv :: Mat转换为IplImage*

amr*_*amr 49 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);
}
Run Code Online (Sandbox Code Playgroud)

这会产生段错误.

还尝试:

while(loop over cv::Mat array)
{
    IplImage* xyz;
    xyz = &array[i];
    cvCopy(iplimagearray[i], xyz);
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个编译时错误: error: cannot convert ‘cv::Mat*’ to ‘IplImage*’ in assignment

坚持我如何进一步,并希望一些建议:)

Yee*_*Fei 22

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

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

  • 它确实提供了对IplImage的转换,创建了一个头而不复制数据.所以`IplImage*img = new IplImage(mat);`应该可行. (40认同)
  • 实际上,你可以这样做:`IplImage iplimg = mat;`只需在你需要`IplImage`的地方使用`&iplimg`.不需要动态分配. (39认同)
  • 这个答案是错误的.看到其他答案,它可以很容易地转换,应该从接受的答案中删除,因为它可能会混淆其他用户. (6认同)

Lov*_*ill 18

Mat image1;
IplImage* image2=cvCloneImage(&(IplImage)image1);
Run Code Online (Sandbox Code Playgroud)

猜猜这会完成这项工作.

编辑:如果您遇到编译错误,请尝试这种方式:

cv::Mat image1;
IplImage* image2;
image2 = cvCreateImage(cvSize(image1.cols,image1.rows),8,3);
IplImage ipltemp=image1;
cvCopy(&ipltemp,image2);
Run Code Online (Sandbox Code Playgroud)


小智 12

 (you have cv::Mat old)
 IplImage copy = old;
 IplImage* new_image = ©
Run Code Online (Sandbox Code Playgroud)

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


min*_*zur 8

这是最近针对 dlib 用户的修复链接

cv::Mat img = ...
IplImage iplImage = cvIplImage(img);
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一的解决方案,不会产生编译器错误。我用 opencv420+dlib-19.8 将它插入到我的项目中 (2认同)