写在前面:早期的OpenCV是基于C的,因此使用名为lplImage的C风格的数据结构在程序内存中来存储图像, 需开发者自行分配和管理内存,风险性高。在C++介入OpenCV后,Opencv2.0引入了Mat对象类型作为图像数据结构,Mat对象包含矩阵头和一个指向像素值的矩阵的指针。内存分配和销毁处理被封装在内部,无需开发者控制,从而一举替代了lplImage。下面介绍Mat的基础功能
1.数据准备:Mat matImg = imread("D:/Learn/OpenCV/Info/PIC/dt.jpg");
2.获取图像宽度:int width=matImg.cols;
3.获取图像高度:int height=matImg.rows;
4.获取指定像素点颜色值:
注意1:以左上角为坐标原点,第一个参数表示纵向坐标,第二个参数代表横向;
注意2:OpenCV中,RGB图像的顺序是BGR;
(1).int value=matImg.at<uchar>(y,x);//用于获取单通道坐标为(y,x)位置的颜色值;
int valueB=matImg.at<Vec3b>(y,x)[0];//用于获取3通道(BGR图像)坐标为(y,x)位置的颜色值B;
int valueG=matImg.at<Vec3b>(y,x)[1];//用于获取3通道(BGR图像)坐标为(y,x)位置的颜色值G;
int valueR=matImg.at<Vec3b>(y,x)[2];//用于获取3通道(BGR图像)坐标为(y,x)位置的颜色值R;
或
(2).const uchar currentValue=matImg.ptr<uchar>(y,x);//通过指针获取单通道指定坐标(y,x)位置的颜色值;
const uchar currentVB=matImg.ptr<Vec3b>(y)[x][0];//通过指针获取三通道(BGR图像)坐标(y,x)位置的颜色值B;
const uchar currentVG=matImg.ptr<Vec3b>(y)[x][1];//通过指针获取三通道(BGR图像)坐标(y,x)位置的颜色值G;
const uchar currentVR=matImg.ptr<Vec3b>(y)[x][2];//通过指针获取三通道(BGR图像)坐标(y,x)位置的颜色值R;
5.像素范围处理:经过运算后的像素点颜色值,可能不在0-255范围内,因此OpenCV提供如下功能:
uchar lower= saturate_cast(-123);//值为0
uchar topper=saturate_cast(321);//值为255
uchar stander=staturate_cast(123);//值为123
6.Mat对象深度复制:区别尚待深入尝试
Mat cloneMat1(matImg);
Mat cloneMat2=matImg;
Mat cloneMat3 = matImg.clone();
Mat cloneMat4;
matImg.copyTo(cloneMat4);
7.Mat对象的其他创建方法:
(1).Mat m1(600, 800, CV_8UC3, Scalar(255, 0, 0));//创建宽度800,高度600,3通道,每个通道255级颜色值,且初始化颜色为Blue的图像
(2).Mat m2(matImg.size(),magImg.type());//创建与matImg同样大小和类型的图像
m2=Scalar(255,0,0);//初始化为纯Blue颜色值
(3).Mat m3=Mat::zeros(matImg.size(),matImg.type());
(4).Mat m4=Mat::zeros(50,50,CV_8U3);
等等,不再赘述
8.获取图像通道数:
int count=matImg.channels;
以上为Mat对象部分基础操作,本篇结束。