OpenCV--Mat对象创建及数据类型

几点提示:

1.使用OpenCV的C++接口时不需要考虑内存释放问题。

2.赋值运算符和拷贝构造函数只复制信息头。

3.使用函数clone()或者copyTo()来复制一幅图像的矩阵。

1、创建Mat对象

Mat类提供了一系列构造函数,可以方便的根据需要创建Mat对象。

使用其中一个用来具体的说明:

Mat::Mat(int rows, int cols, int type)
//创建行数为rows,列数为cols,类型为type的图像

类型的表示格式如下:

CV_[位数][带符号与否][类型前缀]C[通道数]

比如CV_8UC3表示使用8位的unsigned char型,每个像素由三个元素组成三通道。

其他的数据类型表示如下(type):

Mat<uchar>---------CV_8U
Mat<char>-----------CV_8S
Nat<short>---------CV_16S
Mat<ushort>--------CV_16U
Mat<int>-----------CV_32S
Mat<float>----------CV_32F

2、数据类型转换

ConvertTo
oclMat::convertTo(oclMat& m, int rtype, double alpha=1, double beta=0)
m:转为目标数据类型的矩阵;
rtype: 指定目标数据类型,或者是depth(通道数),如果rtype:是负值,那么目标矩阵的数据类型和源矩形的数据类型是一致的;
alpha:基于尺度的变化值;
beta:在尺度上的加和;

cv::Mat matTemp = cv::Mat::zeros(100,100,CV_32F); 
cv::Mat MatTemp2;
matTemp.convertTo(MatTemp2, CV_8U); //把矩阵matTemp转为unsing char类型的矩阵

3、像素值的读写

下面程序介绍了两种对像素值的访问方法,分别为指针访问和动态地址访问,第三种迭代器访问,后续介绍。

上面两个知识点的实例编程如下:

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main()
{
	Mat grayim(600,800,CV_8UC1);
	Mat colorim(600,800,CV_8UC3);

	/***********************************************************************
	方法一:指针访问                                                             
	/************************************************************************/
	//双重循环,遍历所有的像素值
		for(int i = 0;i < grayim.rows;i++)  //行循环
		{  
			uchar* data = grayim.ptr<uchar>(i);  //获取第i行的首地址
			for(int j = 0;j <grayim.cols;j++)   //列循环
			{ 	  
				data[j] = (i+j)%255; 				
			}  
		}  

	/***********************************************************************
	方法二:动态地址计算,使用at()函数实现像素访问                                                             
	/************************************************************************/
	//遍历所有像素,并设置像素值
	for (int i=0; i<colorim.rows;++i)
	{
		for (int j=0; j<colorim.cols; ++j)
		{
			Vec3b pixel;  //OpenCV中有模板类Vec  typedef Vec<uchar,3> Vec3b
			pixel[0]=i%255;  //blue
			pixel[1]=j%255;  //green
			pixel[2]=0;      //red
			colorim.at<Vec3b>(i,j)=pixel;
		}
	}

	//显示结果
	imshow("grayim",grayim);
	imshow("colorim",colorim);

	waitKey();
}



程序输出结果如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值