【OpenCV教程】core 模块 - 常用数据结构的使用
时间:2022-06-25
本文章向大家介绍【OpenCV教程】core 模块 - 常用数据结构的使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
大家都知道,利用函数imwrite,可以将一个矩阵写入图像文件中。但是为了debug,更加方便的方式是看实际值,我们可以通过 Mat的运算符 << ,来实现同样的功能,但这只对二维矩阵有效。
创建一个Mat对象
创建一个Mat对象有多种方法:
- Mat( )构造函数
Mat M(2,2, CV_8UC3, Scalar(0,0,255));
cout << "M = " << endl << " " << M << endl << endl;
对于二维多通道图像,首先要定义其尺寸,即行数和列数。然后,需要指定存储元素的数据类型以及每个矩阵点的通道数。为此,依据下面的规则有多种定义
CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
比如CV_8UC3表示使用8位的 unsigned char 型,每个像素由三个元素组成三通道。预先定义的通道数可以多达四个。Scalar是个short型vector。指定这个能够使用指定的定制化值来初始化矩阵。当然,如果需要更多通道数,也可以使用大写的宏并把通道数放在小括号中,如下所示
- 在 CC++ 中通过构造函数进行初始化
int sz[3] = {2,2,2};
Mat L(3,sz, CV_8UC(1), Scalar::all(0));
上面的例子演示了如何创建一个超过两维的矩阵:指定维数,然后传递一个指向一个数组的指针,这个数组包含每个维度的尺寸;其余的相同
- 为已存在IplImage指针创建信息头:
IplImage* img = cvLoadImage("greatwave.png", 1);
Mat mtx(img); // convert IplImage* -> Mat
- Create( ) function: 函数
M.create(4,4, CV_8UC(2));
cout << "M = "<< endl << " " << M << endl << endl;
这个创建方法不能为矩阵设初值,它只是在改变尺寸时重新为矩阵数据开辟内存。
- MATLAB形式的初始化方式:zeros(), ones(), :eyes() 。使用以下方式指定尺寸和数据类型:
Mat E = Mat::eye(4, 4, CV_64F);
cout << "E = " << endl << " " << E << endl << endl;
Mat O = Mat::ones(2, 2, CV_32F);
cout << "O = " << endl << " " << O << endl << endl;
Mat Z = Mat::zeros(3,3, CV_8UC1);
cout << "Z = " << endl << " " << Z << endl << endl;
- 对于小矩阵你可以用逗号分隔的初始化函数: Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); cout << "C = " << endl << " " << C << endl << endl;
- 使用 clone() 或者 copyTo() 为一个存在的 Mat 对象创建一个新的信息头。 Mat RowClone = C.row(1).clone(); cout << "RowClone = " << endl << " " << RowClone << endl << endl;
格式化打印
Mat R = Mat(3, 2, CV_8UC3);
randu(R, Scalar::all(0), Scalar::all(255));
从上面的例子中可以看到默认格式,除此之外,OpenCV还支持以下的输出习惯
- 默认方式
cout << "R (default) = " << endl << R << endl << endl;
- Python
- cout << "R (python) = " << endl << format(R,"python") << endl << endl;
- 以逗号分隔的数值 (CSV) cout << "R (csv) = " << endl << format(R,"csv" ) << endl << endl;
- Numpy cout << "R (numpy) = " << endl << format(R,"numpy" ) << endl << endl;
- C语言 cout << "R (c) = " << endl << format(R,"C" ) << endl << endl;
打印其他常用项目
OpenCV支持使用运算符<<来打印其它常用OpenCV数据结构。
- 2维点
Point2f P(5, 1);
cout << "Point (2D) = " << P << endl << endl;
- 3维点
Point3f P3f(2, 6, 7);
cout << "Point (3D) = " << P3f << endl << endl;
- 基于cv::Mat的std::vector
vector<float> v;
v.push_back( (float)CV_PI); v.push_back(2); v.push_back(3.01f);
cout << "Vector of floats via Mat = " << Mat(v) << endl << endl;
- std::vector点
vector<Point2f> vPoints(20);
for (size_t E = 0; E < vPoints.size(); ++E)
vPoints[E] = Point2f((float)(E * 5), (float)(E % 7));
cout << "A vector of 2D Points = " << vPoints << endl << endl;
今天小白给大家带来的分享就到这里了,大家收获是不是很丰厚呢?想学习更多关于OpenCV的知识,请继续关注小白学视觉!
往期文章一览
2、【OpenCV教程】core 模块 - Mat - 基本图像容器
- 技术分享 | 深入分析APPCMS<=2.0.101 sql注入漏洞
- React Native布局之FlexBox
- 图算法之bfs、dfs、prim、Dijkstra
- 深入理解Android Build系统
- Mac Jenkins搭建 Android/IOS自动打包环境
- javascript 红皮高程(11)
- javascript 红皮高程(8)
- javascript 红皮高程(7)
- javascript 红皮高程(17)-- 左移(<<)
- javascript 红皮高程(17)-- 按位异或(XOR)
- javascript 红皮高程(17)
- javascript 红皮高程(16)
- javascript 红皮高程(15)
- javascript 红皮高程(21)-- 乘性操作符
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法