Opencv学习----C风格的结构和操作-cv::Mat、CvMat、IplImage相互转换

4.5.3 cv::Mat、_IplImage、CvMat相互转换

4.5.3.1 cv::Mat转cv::Mat

//浅拷贝
Mat a;
Mat b = a; //“copy” a to b
Mat c(a); //“copy” a to c
//深拷贝
Mat a;
Mat b = a.clone(); //copy a to b
Mat c;
a.copyTo(c); //copy a to c

4.5.3.2 CvMat转CvMat

//深拷贝
CvMat* a; 
CvMat* b = cvCloneMat(a); //copy a to b

4.5.3.3 IplImage转IplImage

void cvCopy(const CvArr* src, CvArr* dst, const CvArr*mask=NULL)

参数:

•src - 源数组

•dst - 目标数组

•mask - 操作掩码,8位单通道数组; 指定要更改的目标数组的元素

如果任何传递的数组是IplImage类型,则使用其ROI和COI字段。两个阵列必须具有相同的类型,相同的维度数和相同的大小。该函数还可以复制稀疏数组(在这种情况下不支持掩码)。

IplImage * cvCloneImageconst IplImage * image

参数:

•image - 原始图像

4.5.3.4 cv::Mat转CvMat

//浅拷贝
Mat a;
CvMat b = a; //“copy” a to b
//深拷贝
Mat a;
CvMat *b;
CvMat temp = a; //转 CvMat类型.
cvCopy(&temp, b); //真正的副本。cvCopy遵循分配空间.

4.5.3.5 cv::Mat转IplImage

// 浅拷贝
Mat M; 
IplImage img = M; 
IplImage img = IplImage(M); 
// 深拷贝 
cv :: Mat img2; 
IplImage imgTmp = img2; 
IplImage * input = cvCloneImage(&imgTmp);

4.5.3.6 CvMat转cv::Mat

//构造函数: Mat::Mat(const CvMat* m, bool copyData=false); 
CvMat* a;
//浅拷贝
Mat b(a); //“copy” a to b
Mat b(a, false); //“copy” a to b
Mat b = a; //“copy” to b
//深度复制,并将copyData设置为true
Mat b = Mat(a, true); //copy a to b

4.5.3.7 CvMat转IplImage

//cvGetImage()
CvMat M;
IplImage* img = cvCreateImageHeader(M.size(), M.depth(), M.channels());
cvGetImage(&M, img); //深拷贝
//或者
CvMat M;
IplImage* img = cvGetImage(&M, cvCreateImageHeader(M.size(), M.depth(), M.channels()));
//cvConvert()
CvMat M;
IplImage* img = cvCreateImage(M.size(), M.depth(), M.channels());
cvConvert(&M, img); //深拷贝

4.5.3.8 IplImage转cv::Mat

Mat cvarrToMat(const CvArr* arr, bool copyData=false, bool allowND=true, int coiMode=0 )

参数:

•arr - 输入CvMat,IplImage或CvMatND。

•copyData - 当为false(默认值)时,不复制数据且仅创建新标头,在这种情况下,在使用新的矩阵标头时不应释放原始数组; 如果参数为true,则复制所有数据,您可以在转换后立即取消分配原始数组。

•allowND - 当为true(默认值)时,如果可能,则将CvMatND转换为二维Mat(参见下面的讨论); 如果不可能,或者参数为false,则该函数将报告错误。

•coiMode -

指定如何处理IplImage COI(设置时)的参数。

如果coiMode = 0且设置了COI,则该函数报告错误。

如果coiMode = 1,则该函数不会报告错误。相反,它会将标题返回到整个原始图像,您必须手动检查和处理COI。请参阅extractImageCOI()。

通常,该函数用于将旧式2D数组(CvMat或IplImage)转换为Mat。但是,该函数也可以将CvMatND作为输入并为其创建Mat()(如果可能)。并且,对于CvMatND A,当且仅当A.dim [i] .size * A.dim.step [i] == A.dim.step [i-1]为所有或除了一个i之外的所有情况都是可能的,0 <i <A.dims。也就是说,矩阵数据应该是连续的,或者它应该可以表示为连续矩阵序列。通过以这种方式使用此函数,您可以使用任意元素方式函数处理CvMatND。

最后一个参数coiMode指定如何处理具有COI集的图像。默认情况下,它为0,当带有COI的图像进入时,函数报告错误。而coiMode = 1表示没有发出错误信号。您必须检查COI存在并手动处理它。现代结构,如Mat和MatND本身不支持COI。要处理新样式数组的单个通道,您需要在数组上组织循环(例如,使用矩阵迭代器),其中将处理感兴趣的通道,或者使用mixChannels()提取COI(对于新的样式数组)或extractImageCOI()(对于旧式数组),处理这个单独的通道,并在需要时将其插回输出数组(分别使用mixChannels()或insertImageCOI())。

4.5.3.9 IplImage转CvMat

//cvGetMat()
IplImage* img;
CvMat temp;
CvMat* mat = cvGetMat(img, &temp); //深拷贝
//cvConvert()
CvMat *mat = cvCreateMat(img->height, img->width, CV_64FC3); //注意高度和宽度的顺序
cvConvert(img, mat); //深拷贝

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dylan55_you

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值