【1】Vec3f的介绍
Vec3f表示的是3通道float类型的 Vect,就相当于3通道float类型的图像(这是其中一个具体化),解释可以从源代码中看出来。
下面给出一个具体的例子:
Vec3f point = Vec3f(10,10,3.2);//Float, 3 components 一个向量由三个float组成
Mat mat(3,3,CV_32FC3,);//3 channel matrix 三通道
Vec3f v3f = mat.at<Vec3f>(y, x);//read color values for pixel (y,x)
这里注释一下:Vec3f是一种数据类型,其是3通道的float,后面的mat.at<Vec3f>(y, x)是访问图像的一种方式。(可以从定义形式上看出来 int a=....)
【2】Vec的介绍
Vec的表示 ---- Vec2b,Vec3b,Vec2s,Vec3s
//【1】Vec2b---表示每个Vec2b对象中,存储2个char(字符型)数据
typedef Vec<uchar, 2> Vec2b; 、
//【2】Vec3b---表示每一个Vec3b对象中,存储3个char(字符型)数据,比如用这样的对象,去存储RGB图像中的一个像素点
typedef Vec<uchar, 3> Vec3b;
//【3】Vec4b---表示每一个Vec4b对象中,存储4个字符型数据,用这样的类对象去存储---4通道RGB+Alpha的图像中的像素点
typedef Vec<uchar, 4> Vec4b;
//【4】Vec2s---表示这个类的每一个类对象,存储2个short int(短整型)的数据
typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;
Vec的表示---Vec3b
例如 8U 类型的 RGB 彩色图像可以使用 <Vec3b>
Vec3f是一种数据类型,其是3通道的float;
后面的mat.at<Vec3f>(y, x)是访问图像的一种方式;
mat.at<Vec3f>(y, x)[0];mat.at<Vec3f>(y, x)[1];mat.at<Vec3f>(y, x)[2];
对于mat的理解,可以认为mat.at<Vec3f>是mat的一种访问形式,其有点类似vector。
【3】Vec原模型和定义模型
【3.1】Vec<int, 3> vi
//vec构造的向量为列向量----》》》》》多行一列
Vec<int, 3> vi(1,2,3);//构造并且初始化3x1 3行一列
cout << "vi向量的行数" << vi.rows << endl;
cout << "vi向量的列数" << vi.cols << endl;
Vec<int, 4> vi1(1, 2, 3, 4);//构造4x1 4行一列
cout << "vi1向量的行数" << vi1.rows << endl;
cout << "vi1向量的列数" << vi1.cols << endl;
cout << "访问vi1向量的第0个元素" << vi1[0] << endl;
cout << "访问vi1向量的第1个元素" << vi1[1] << endl;
cout << "访问vi1向量的第2个元素" << vi1[2] << endl;
cout << "访问vi1向量的第3个元素" << vi1[3] << endl;
Vec<int,2> vi2(1,2);//构造2x1 2行一列
cout << "vi2向量的行数" << vi2.rows << endl;
cout << "vi2向量的列数" << vi2.cols << endl;
cout << "访问vi2向量的第0个元素" << vi2[0] << endl;
cout << "访问vi2向量的第1个元素" << vi2[1] << endl;
Vec3f point1 = Vec3f(10, 10, 3.2);//构造了一个3通道的浮点型向量
cout << point1 << endl;
Vec4f point2 = Vec4f(10, 10, 3.2,5);//构造了一个4通道的浮点型向量
cout << point2 << endl;
Vec3d point3 = Vec3d(10, 10, 3.2);//构造了一个3通道的双精度型向量
cout << point3 << endl;
【3.2】Mat MM = (Mat_<Vec3f>(3, 3));
//构建一个3x3的矩阵 矩阵中每一个元素为三通道浮点型的点 边创建边赋值
Mat iamge = (Mat_<Vec3f>(2,2)<< Vec3f(1,2,3), Vec3f(1, 2, 3), Vec3f(1, 2, 3), Vec3f(1, 2, 3));//创造并且赋值
for (size_t i = 0; i < iamge.rows; i++)
{
for (size_t j = 0; j <iamge.cols; j++)
{
cout << iamge.at<Vec3f>(i, j) <<endl;
}
}
//构建一个2x2的矩阵 矩阵中每一个元素为三通道浮点型的点 先创建后赋值
Mat MM = (Mat_<Vec3f>(3, 3));//2x2三通道矩阵如何赋值?????? 先创建后赋值
for (int i = 0; i < MM.rows; i++)
{
for (int j = 0; j < MM.cols; j++)
{
for (int c = 0; c < MM.channels(); c++)
{
//给M的每一个元素赋值
MM.at<Vec3f>(i, j)[c] = c * 10;
}
}
}
cout << MM << endl;//输出矩阵
//创建多维矩阵 自定义数据类型
typedef Vec<double, 5> Vec5d;
//生成一个2x3x5的Mat,数据为double型
Mat M = Mat::zeros(2, 3, CV_64FC(5));
cout << "channel = " << M.channels() << endl;//输出为5
for (int i = 0; i < M.rows; i++)
{
for (int j = 0; j < M.cols; j++)
{
for (int c = 0; c < M.channels(); c++)
{
//给M的每一个元素赋值
M.at<Vec5d>(i, j)[c] = c * 0.01;
}
}
}
cout << M << endl;//输出矩阵
【3.3】Mat image = Mat(500, 500, CV_8UC3);
Mat image3 = Mat(500, 500,CV_8UC3);//构造了一张灰度图像
imshow("image3", image3);
Mat image1 = Mat(500, 500, CV_8UC3, Scalar(0, 0, 255));//构造了一张红色图像 CV_8UC3
imshow("image1", image1);