Day 4 - Opencv 深入了解Mat

1. Mat的初始化操作

	/*
	创建Mat数据结构的几种方式
	*/
	std::string winName = "Image";
	//1.默认初始化
	cv::Mat image1; //大小为0

	//2.指定初始大小
	//  CV_8U表示每个像素对应一个字节,U表示无符号
	//  480 rows,高度  640 cols,宽度
	cv::Mat image2(480, 640, CV_8U, 100);
	
	//3.创建一幅彩色图像
	//  CV_8UC3 表示三通道
	//  Scalar(0, 0, 255) 分别对应BGR,那么创建的图像就为红色
	//  灰度图像可以使用 Scalar(100)
	cv::Mat image3(480, 640, CV_8UC3, cv::Scalar(0, 255, 0));

	//  cv::Size结构包含了矩阵的【高度,宽度】信息,因此也可如下创建
	cv::Mat image4(cv::Size(640, 480), CV_8UC3, cv::Scalar(0, 0, 255));

	//4.用create方法分配或者重新分配图像的数据块
	//  如果图像已被分配,则原先内容会被释放
	//  如果尺寸和类型与原有相同,为了考虑性能,则不会被重新分配内存
	image4.create(cv::Size(640, 480), CV_8UC3);

	//5.赋值
	//对下面图像的任何一幅图像进行改变,都会影响到其他图像,因为都是指向同一片内存区域
	cv::Mat image5(image4);
	image1 = image5;

注意事项:

  • 当没有指向Mat的引用时,分配的内存就会被自动释放掉,它的实现方法是通过Mat进行引用计数和浅复制
  • 由于只维护了一个引用计数器,所以只有当图像的所有引用都将释放,或者赋值给另一个图像时,内存才会被释放
  • 以下情况图像数据不会被复制,而是指向同一处内存:赋值、图像间的值传递和值返回
  • 在使用类的时候要注意,不要返回图现象的类属性,因为会对图像属性进行浅复制,副本一旦被修改,图像属性也会被偷偷的修改

2. Mat数据的深复制

  • 下面是Mat文件深复制的一些方法
  • copyTo: 目标图像会调用create方法创建或者重新分配一片内存区域
  • clone:直接生成一幅新的图像
  • 这些图像是原始图像的新副本
	cv::Mat image6;
	image5.copyTo(image6);
	cv::Mat image7 = image6.clone();
;
  • 如果需要将一幅图像复制到另一幅图像中,且两幅图像的数据类型不一定相同,则需使用convertTo()
    //转换成浮点型数据[0, 1]
	//保持两幅图像的通道数相同,但不相同也不会报错
	//转换后的像素值的计算公式为 g(x,y) = 1/255.0 * f(x,y) + 0.0 
	image2.convertTo(image7, CV_32F, 1 / 255.0, 0.0);

3. Mat小矩阵计算

	//小矩阵计算
	cv::Matx33d matrix1(1, 2, 3, 4, 5, 6, 7, 8, 9);//3*3
	cv::Matx31d matrix2(1, 1, 1);  //3*1  列向量
	cv::Matx31d matrix3 = matrix1 * matrix2;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值