从 Iplimage 到 Mat 的转换不保留深度信息

Posted

技术标签:

【中文标题】从 Iplimage 到 Mat 的转换不保留深度信息【英文标题】:Conversion from Iplimage to Mat doesn't retain depth information 【发布时间】:2013-01-04 15:40:14 【问题描述】:

好的...我不知道我缺少什么,但是 opencv 文档说您可以从 IplImage 构造一个 Mat。我有一个 IplImage,但是在构建 Mat 之后,它会丢失深度信息。在将深度信息传递给 calcHist 函数之前,我需要检查它。

cout<<"image depth:"<<image->depth<<endl;
cout<<"image size: "<<image->height<<" "<<image->width<<endl;

Mat src(image);
cout<<"src   depth:"<<src.depth()<<endl;
cout<<"src   size: "<<src.size().height<<" "<<src.size().width<<endl;

我的输出看起来像这样。请注意,深度信息已消失:

image depth:8
image size: 257 109
src   depth:0
src   size: 257 109

【问题讨论】:

【参考方案1】:

基本上是正确的,因为 CV_8U==0。详情请见here。

IplImage 结构中加载图像时,深度设置为IPL_DEPTH_8U,即8。 在Mat结构中加载图片时,深度为CV_8U,即为0。

我对一张普通的图片做了一个小测试:

Mat frame=imread(szImagefile,CV_LOAD_IMAGE_GRAYSCALE);
cout<<"image depth:"<<frame.depth()<<endl;

结果:

image depth:0

【讨论】:

这并不能解释为什么从 IplImage 转换为 Mat 时深度会发生变化。我同意如果我的 IplImage 是 CV_8U,那么我的 Mat 的深度应该是 0。 @qwerty9967 它没有改变。 IplImage 的深度设置为 IPL_DEPTH_8U,即 8,Mat 的深度设置为 CV_8U,即 0。 嗯……这就解释了。谢谢您的帮助。您能否编辑您的回复以在回复中包含您的评论。这就是我错过的重点。

以上是关于从 Iplimage 到 Mat 的转换不保留深度信息的主要内容,如果未能解决你的问题,请参考以下文章

从 IplImage 转换为 Mat 且 cvarrToMat 缺少/跳过图像数据字节

opencv编程中错误提示:不存在从mat到cvmat适当的转换函数。

OpenCV Mat 到 IplImage* 的转换

如何从 c++ 接口 cv::Mat 转换为 c IplImage?

OpenCV中IplImage和Mat间的相互转换

opencv:将iplimage转换为mat后出错