您的位置:首页 > 运维架构

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

2017-02-13 14:45 246 查看
几点提示:
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();
}

程序输出结果如下:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: