创建mat矩阵
/*创建矩阵
3000行
4000列
CV_8UC3:数据类型
CV_:OpenCV中定义数据类型的前缀
8U表示8位无符号整数
C3表示有3个通道
*/
Mat mat(3000, 4000, CV_8UC3);
/*
清理原有空间并创建
*/
mat.create(200, 100, CV_8UC1);
获取mat的形状尺寸
/*
mat.row行数
mat.cols列数
mat.elemSize()通道数
*/
cout << mat.rows << " " << mat.cols << " " << mat.elemSize();
/*
释放空间
release或者析构:引用计数为1时才会释放(所有引用都释放了)
判断存储空间是否连续
isContinuous
判断存储空间是否连续
通过step记录
遍历
遍历连续存储的图片中的像素
int size = mat.rows*mat.cols*mat.elemSize();
for (int i = 0; i < size; i += 3) {
cout<<mat.data[i]<<" "<< mat.data[i+1]<<" "<< mat.data[i+2];
}
遍历不连续存储的矩阵
for (int row = 0; row < mat.rows; row++)
{
for (int col = 0; col < mat.cols; col++)
{
(&mat.data[row*mat.step])[col*es] = 0;
(&mat.data[row*mat.step])[col*es + 1] = 0;
(&mat.data[row*mat.step])[col*es + 2] = 0;
}
}
通过ptr接口遍历Mat,性能基本等同于有地址访问(模板函数)
for (int row = 0; row < mat.rows; row++){
for (int col = 0; col < mat.cols; col++)
{
Vec3b *c = mat.ptr<Vec3b>(row, col); //返回一个指针
c->val[0] = 255;
c->val[1] = 255;
c->val[2] = 255;
}
}
通过at接口遍历Mat
for (int row = 0; row < mat.rows; row++) {
for (int col = 0; col < mat.cols; col++)
{
Vec3b &m = mat.at<Vec3b>(row, col); //返回引用类型
m[0] = 255;
m[1] = 255;
m[2] = 255;
}
}
迭代器遍历mat
auto it = mat.begin<Vec3b>();
auto it_end = mat.end<Vec3b>();
for (; it != it_end; it++) {
(*it).val[0] = 0;
(*it).val[2] = 0;
(*it).val[1] = 0;
}
读取、显示、保存图片
IMREAD_COLOR—以BGR格式读取图片
Mat img = imread("E:\\123.png",IMREAD_COLOR);
判断是否读取成功,并显示图片
if (img.data == NULL) { // 也可用if(img.empty())
cout << "读取失败";
}
else{
//克隆
Mat img2 = img.clone();
// 保存文件,如果保存成功,返回true,否则返回false
bool ret = imwrite("E:\\1234.png", img);
// 显示图片
namedWindow("显示图片"); //z创建窗口
imshow("显示图片",img);//将图片显示在窗口上
}
waitKey(3000); // 显示3秒