欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Opencv Mat类与像素值处理,图片读取

程序员文章站 2022-07-14 11:12:15
...

Mat类与scalar

//创建一个矩阵
Mat A(3,3,CV_8UC1,Scalar::all(77));
cout<<A;

Opencv Mat类与像素值处理,图片读取
这里的含义是建立一个row=3,col=3的矩阵A,矩阵中的数据类型是8位深度的数据,并且是单通道的。Scalar最多可以有4个元素,它常用的构造函数为Scalar(a,b,c,d);这样可以构建出一个通道的数值,并赋值给各个像素。

为什么这里要使用all(77),因为有时候我们不想去关系具体是单通道还是多通道的,为了提高鲁棒性,我们直接all(77),那么就建立对应的77就可以了。这里全部设置为77.

单个元素的选取

uchar+at< uchar > 方法
Mat A(3, 3, CV_8UC1,Scalar::all(10));
auto val = A.at<uchar>(1, 1);
cout << val << endl;

Opencv Mat类与像素值处理,图片读取
这里使用了at< uchar >方法,由于提取了row=1,col=1的元素的值为77,但是C++默认为字符输出,输出了‘M’字符,因此如果我们希望在uchar的情况下打印一个数值,那么因该使用强制类型转换(int)

Mat A(3, 3, CV_8UC1,Scalar::all(10));
auto val = A.at<uchar>(1, 1);
cout << (int)val << endl;

Opencv Mat类与像素值处理,图片读取

Vec3b+at< Vec3b > 方法
Mat A(3, 3, CV_8UC3,Scalar::all(77));
		cout << A << endl;
		auto val = A.at<Vec3b>(1, 1);
		cout << val << endl;

Opencv Mat类与像素值处理,图片读取
这里由于已经重载了vec3b的输出,因此打印的时候直接输出了vec3b的向量

uchar+ptr< uchar >方法
Mat A(3, 3, CV_8UC1,Scalar::all(77));
cout << A << endl;
auto val=A.ptr<uchar>(1, 1);
cout << val<<endl;

Opencv Mat类与像素值处理,图片读取
这里由于是一个char*,即char指针,因此输出的时候会连续输出,并且以字符的形式输出。如果需要输出具体的值,那么我们需要这么做,即使用*运算符并且使用强制类型转换(int)

Mat A(3, 3, CV_8UC1,Scalar::all(77));
cout << A << endl;
auto val=A.ptr<uchar>(1, 1);
cout << (int)*val<<endl;
Vec3b+ptr< Vec3b >方法
Mat A(3, 3, CV_8UC3,Scalar::all(77));
cout << A << endl;
auto val=A.ptr<Vec3b>(1, 1);
cout << *val<<endl;

Opencv Mat类与像素值处理,图片读取
使用ptr方法得到向量的指针, 使用*运算符取值,再使用cout将值具体的打印出来。

图像读取

Opencv的图像读取默认的flag==1,此时读取得到的是3通道图像。我们可以使用ptr方法对元素值操作,也可以使用at方法对元素值操作。
Opencv Mat类与像素值处理,图片读取

代码
Mat imageInput = imread(tmpfilename);
auto val = imageInput.ptr<Vec3b>(3, 3);
cout << *val << endl;
auto val2 = imageInput.at<Vec3b>(3, 3);
cout << val2;