Mat对象OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部
Mat对象构造函数与常用方法:
第一个:初始一个mat对象并利用Scalar赋值
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("D:/opencv/2/a.jpg"); //把图像保存到src里
if (src.empty())
{
printf("could not load image...\n");
return 0;
}
namedWindow("input", WINDOW_FREERATIO);
imshow("input", src); //imshow 将图片读取出来,“input”为窗口名称
Mat drt;
drt = Mat(src.size(), src.type()); //初始了一个mat对象,与src图像的大小和类型相同
//此时type为空,用下面Scalar,赋值。
drt = Scalar(127, 0, 255);
namedWindow("output", WINDOW_FREERATIO);
imshow("output", drt);
waitKey(0);
return 0;
}
效果:
第二个:拷贝图像
Mat src = imread("D:/opencv/2/a.jpg"); //把图像保存到src里
Mat drt=src.clone();//完全拷贝一
Mat drt;
src.copyTo(drt);//完全拷贝二
第三个:获取通道数(一般彩色为3,灰色为1)
Mat drt=src.clone();//完全拷贝一
//方法一
cout<<src.channels();
//方法二
printf("scr的通道数",src.channels());
第四个:得到图像的行和列的数量和用指针得到像素
//得到图像的行和列的数量
int cols = src.cols;
int row = src.rows;
printf("cols : %d row : %d\n", cols, row);
//用指针得到像素
const uchar*fistrow = src.ptr<uchar>(0);
const uchar* fistrow1 = src.ptr<uchar>(1);
printf("firstrow : %d ", fistrow);
printf("firstrow1 : %d ", fistrow1);
第五个:Mat对象创建
Mat M(2,2,CV_8UC3, Scalar(0,0,255))
其中前两个参数分别表示行(row)跟列(column)、第三个CV_8UC3中的8表示每个通道占8位、U表示无符号、C表示Char类型、3表示通道数目是3,第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致
Mat M(100,100,CV_8UC3, Scalar(127, 0, 255));
imshow("output", M);