opencv中图像复制的坑
来源:互联网 发布:阿里云rap 编辑:程序博客网 时间:2024/04/29 05:57
事情是这样的,我想把IplImage转换到Mat,然后使用Mat做相关的处理,我是这么干的:
IplImage *tmpCutImg=cvCreateImage(cutSize,srcImage->depth,srcImage->nChannels);GetImageRect(srcImage,iRect,tmpCutImg);Mat cutMat(tmpCutImg);cvReleaseImage(&tmpCutImg);//释放IplImage的内存//显示Mat图像imshow("cutMat",cutMat);waitKey(1);
然后就发现跪掉了,显示的图像根本是一张乱码图片,后来发现是因为使用
Mat cutMat(tmpCutImg);
将IplImage转换为Mat时,Mat和IplImage共用数据区,在显示Mat之前就将tmpCutImg释放掉,Mat中的数据就变成随机的了,显示就成乱码了。所以正确的做法应该是在使用完毕Mat后再释放tmpCutImg。
同样的,使用Mat的构造函数进行Mat的构造也会是这种情况,产生的新的Mat会与原来的Mat公用相同的数据区。如下所示:
Mat A=imread("test.jpg");Mat A(B);
上面的操作构造出来的B会和A共用数据区,如果对B的数据区进行了操作,A的内容也会变化,因此如果想要复制全新的独立的Mat,要使用如下方式:
Mat B=A.clone();
还有一个函数是
void Mat::copyTo(OutputArray m, InputArray mask) const
这个函数的用法跟clone()的关系看了下面的代码就明白了:
inline Mat Mat::clone() const{ Mat m; copyTo(m); return m;}
所以如果不提供mask,那么clone()与copyTo()的功能是一样的,而不同的是copyTo()拷贝Mat时只拷贝mask不为零的位置,且mask的类型必须为CV_8U
1 0
- opencv中图像复制的坑
- OpenCV中图像及子图像ROI之间的复制
- OpenCV中图像及子图像ROI之间的复制
- OpenCV中图像及子图像ROI之间的复制
- OpenCV中图片数据的内存管理:图像深度复制与浅复制
- 【OpenCV】图像的内存分配与释放以及复制图像
- openCV中图像的剪切
- opencv 中图像的坐标系
- OpenCV图像区域复制粘贴
- OpenCV中的图像复制机制
- OpenCV图像区域复制粘贴
- OpenCV读取、复制、保存图像
- 学习opencv之图像的创建,复制,保存
- python opencv(9)图像的复制与灰度化
- opencv中图像的通道的解释
- OpenCV中图像的通道问题
- Qt中显示opencv的图像
- 图像处理中常用的OpenCV函数
- 90002---POJO和javabean的异同
- 机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
- 远程桌面超连结数量
- Android Bander设计与实现 - 设计篇
- innobackupex: Error: Failed to connect to MySQL server as DBD::mysql module is not installed at /usr
- opencv中图像复制的坑
- 《将博客搬至CSDN》
- JQuery 禁用所有select标签的值
- jQuery对象DOM对象互转
- C#学习笔记 事件
- SOAP Binding: Difference between Document and RPC Style Web Services
- 服务接口参数
- 导出长数据不换行
- 解决ubuntu sublime text3 不能使用中文输入发