【6】OpenCV中vec类的介绍

【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=....)
原文:https://blog.csdn.net/xfortius/article/details/7761622 

【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>

原文:https://blog.csdn.net/qq_40119386/article/details/88736212 

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);


 

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值