.什么是Mat
图像文件的内存数据对象,通俗说就是在OpenCV当中用来把imread读取进来的图像存储起来结构在内存当中大致分为两块,一块是头部,存储一些原数据的信息,这些原数据的信息包括图像的宽高位数深度等等另一块是数据部分,就是他的像素数据。我们一般比较感兴趣的就是寻找他的像素数据,我们想改变图像上的信息我们就要改变像素数据。
当我们把读取一个图像数据之后,我们把他赋值给另外一个Mat对象,这两个Mat对象都指向同一个Date Block,他的数据部分并没有改变,但当我们拷贝或者克隆Mat对象,他就会完完全全创建一个新的Mat对象。

.获取图像 宽 高 通道 深度 类型
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char**argv) {
Mat src = imread("D:/images/flower.png");//读取图片
if (src.empty()) {
printf("Could not find image file");
return -1;
}
namedWindow("002-Demo", WINDOW_AUTOSIZE);//创建自适应窗口
imshow("002-Demo", src);
int width = src.cols;//获取宽
int height = src.rows;//获取高
int dim = src.channels();//获取通道
int d = src.depth();//获取深度
int t = src.type();//获取类型
cout << "width:" << width<<endl << "height:" << height << endl << "dim:" << dim <<endl << "depth:" << d << endl << "type:" <<t<<endl;//输出
waitKey(0);
destroyAllWindows();
return 0;
}
运行结果如下
.图像类型与结构信息
.Mat对象创建(六种方式)
方式一
//create one
Mat t1 = Mat(256, 256, CV_8UC3);
//第一个参数表示图像高,第二个参数表示图像宽,第三个参数表示通道类型
t1 = Scalar(0,255,255);//给图像上色
方式二
//create two
Mat t2 = Mat(Size(256, 256), CV_8UC3);
t2 = Scalar(0, 255, 255);
方式三
//create three
Mat t3 = Mat::zeros(Size(256, 256), CV_8UC3);//zeros:表示创建所有通道全为0的
方式四和五
Mat t4 = src;
Mat t4 = src.clone();//克隆图像
src.copyTo(t5);//复制图像
方式六
Mat t6 = Mat::zeros(src.size(), src.type());//创建一个和src一样尺寸和类型的像素为0的图像
遍历与访问像素(两种方式)
方法一:基于数组遍历方式
//visit each pixel
int ch = src.channels();
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
if (ch == 3) {
Vec3b pixel = src.at<Vec3b>(row, col);
int blue = pixel[0];
int green = pixel[1];
int red = pixel[2];
src.at<Vec3b>(row, col)[0] = 255 - blue;
src.at<Vec3b>(row, col)[1] = 255 - green;
src.at<Vec3b>(row, col)[2] = 255 - red;
}
if (ch == 1) {
int pv = src.at<uchar>(row, col);
src.at<uchar>(row, col) = (255 - pv);
}
}
}
imshow("pixel-demo", src);
运行结果 数组遍历方式将原图相反图显示了出来

方法二:基于指针遍历方式
Mat result = Mat::zeros(src.size(), src.type());
for (int row = 0; row < height; row++) {
uchar*curr_row = src.ptr<uchar>(row);//获取当前行指针
uchar*result_row = result.ptr<uchar>(row);
for (int col = 0; col < width; col++) {
if (dim == 3) {
int blue = *curr_row++;
int green = *curr_row++;
int red = *curr_row++;
*result_row++ = blue;
*result_row++ = green;
*result_row++ = red;
}
if (dim == 1) {
int pv = *curr_row++;
*result_row++ = pv;
}
}
}
imshow("pixel-demo", result);
运行结果 指针遍历方式将原图复制了一遍

4242



被折叠的 条评论
为什么被折叠?



