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---------CV_8U
Mat-----------CV_8S
Nat---------CV_16S
Mat--------CV_16U
Mat-----------CV_32S
Mat----------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 
#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(i);  //获取第i行的首地址
			for(int j = 0;j  Vec3b
			pixel[0]=i%255;  //blue
			pixel[1]=j%255;  //green
			pixel[2]=0;      //red
			colorim.at(i,j)=pixel;
		}
	}

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

	waitKey();
}



程序输出结果如下:



你可能感兴趣的:(OpenCV)