OpenCV3 第四章学习笔记-------Mat用法、多种格式化输出方法、常用数据结果、基本绘图操作
2019-02-23 22:06
591 查看
目录
一、Mat结构的使用
1、OpenCV简介
OpenCV是计算机视觉库(图像处理库),主要工作是操作和处理一个包含众多强度值的像素点矩阵。早期的OpenCV基于c接口构建的,那时利用IplImage的C语言结构体在内存中存储图像,要手动管理内存,如果退出前忘记释放内存就会导致内存泄漏,不利于大型程序开发。OpenCV在2.0之后采用了C++接口,利用C++类的概念,轻松实现自动管理内存。
C++接口唯一的不足:当前嵌入式开发系统只支持C语言,所以这种情况下要用c接口的。
2、Mat类介绍 —图像容器类&通用矩阵类
-
不必手动为其开辟空间
-
不必再在不需要时手动将空间释放
-
Mat是一个类,包括矩阵头(包括矩阵尺寸、存储方法、存储地址等)和矩阵(存储矩阵所有像素值,可以是不同维数的)
-
OpenCV作为图像处理库,内部含有多个图像处理函数,常常在函数之间进行图像传递,而图像传递创建副本时由于矩阵有时很大会造成很大的开销,为了解决这个问题,OpenCV中采用了
-
计数机制—只复制矩阵头而不复制矩阵
即让每个Mat对象都有自己的矩阵头(信息头),但共享同一个矩阵(让矩阵指针指向同一地址实现),拷贝函数只拷贝矩阵头而不复制矩阵,对任何一个对象的操作都会影响其他对象。因为这种通过拷贝函数生成的多个对象,矩阵是属于多个对象的,当不再需要时,通过最后一个使用他的对象清除。
计数体现在:无论什么时候复制矩阵头,计数器都加一,反之,释放信息头时,计数器减一,当计数器为0时,矩阵就被清除。
-
函数clone()和copyTo()实现复制矩阵
3、Mat类对象的七种创建方式
[code]#include "stdafx.h" #include<iostream> #include<windows.h> using namespace std; // 以下四句话作为OpenCV的标配 #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/opencv.hpp> using namespace cv; //OpenCV中的C++类和函数都是定义在cv的命名空间 int main() { // 三、创建Mat对象的其中方式 // 3.1 使用Mat()构造函数:Mat M(行, 列, CV_[位数][带符号与否][类型前缀]C[通道数], // Scalar(初始值列表)); //2*2,每个像素灰度值用8位无符号char型表示(0~255), //每个像素是由三个元素组成的三通道。初始值为(0,3,255) Mat M(2, 2, CV_8UC3, Scalar(0, 3, 255)); cout << "M=" << endl << "" << M << endl << endl;//<<运算符只对二维的有效 // 3.2 C/C++中通过构造函数进行初始化 int sz[3] = { 2,2,2 }; Mat L(3, sz,CV_8UC3, Scalar::all(0)); //imshow("L", L);显示错误 /* // 3.3 为已存在的IplImage指针创建信息头 /IplImage* img = cvLoadImageA("1.jpg", 1); Mat mtx(img);*/ // 3.4 利用creat()函数,不能设置矩阵的初始值,且必须先定义对象(矩阵头),再创建矩阵 Mat C; C.create(4, 4, CV_8UC(3));// CV_8UC(a)—有a个4*4的矩阵放在一行 cout << "C=" << endl << "" << C << endl << endl;//<<运算符只对二维的有效 // 3.5 采用Matlab式的初始化方式:ones(),zeros(),eyes() Mat E = Mat::eye(4, 4, CV_64F); cout << "3.5: E=" << endl << "" << E << endl << endl; Mat Z = Mat::zeros(4, 4, CV_64F); cout << "3.5: Z=" << endl << "" << Z << endl << endl; Mat O = Mat::ones(4, 4, CV_64F); cout << "3.5: O=" << endl << "" << O << endl << endl; // 3.6 对小矩阵使用逗号分隔式初始化函数 Mat D = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); cout << "D = " << endl << "" << D << endl << endl; // 3.7 为已存在的对象创建新的信息头 Mat RowClone = D.row(0).clone(); cout << "RowClone = " << endl << "" << RowClone << endl << endl; Sleep(10 * 1000);//延时 waitKey(10); return 0; // 按下ESC键,程序退出 }
4、OpenCV对矩阵的输出格式
[code]#include "stdafx.h" #include<iostream> #include<windows.h> using namespace std; // 以下四句话作为OpenCV的标配 #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/opencv.hpp> using namespace cv; //OpenCV中的C++类和函数都是定义在cv的命名空间 int main() { // 四、OpenCV中格式化输出方法 // 4.0 产生一个矩阵,并用在一定范围内的随机数填充矩阵 Mat r = Mat(2, 3, CV_8UC3); randu(r, Scalar::all(0), Scalar::all(255)); // 4.1 输出格式一:OpenCV默认风格 cout << "r(OpenCV默认风格)=:\n" << r << ";" << endl << endl; // 4.2 输出格式一:Python默认风格 //cout << "r(Python默认风格)=:\n" << format(r,"python") << ";" << endl << endl;//OpenCV2 cout << "r(Python风格)=:\n" << format(r,Formatter::FMT_PYTHON) << ";" << endl << endl;//OpenCV3 // 4.3 逗号分隔风格(Comma separated values,CSV) cout << "r(CSV风格)=:\n" << format(r, Formatter::FMT_CSV)<< ";" << endl << endl;//OpenCV3 // 4.4 Numpy风格 cout << "r(Numpy风格)=:\n" << format(r, Formatter::FMT_NUMPY) << ";" << endl << endl;//OpenCV3 // 4.5 C语言 cout << "r(C语言)=:\n" << format(r, Formatter::FMT_C) << ";" << endl << endl;//OpenCV3 // 4.6 Matlab语言 cout << "r(Matlab语言)=:\n" << format(r, Formatter::FMT_MATLAB) << ";" << endl << endl;//OpenCV3 Sleep(20 * 1000);//延时 waitKey(0); return 0; }
5、OpenCV输出其他常用数据结构
[code] // 五、输出其他数据结构 // 5.1 定义和输出二维点 Point2f p(6, 2); cout << "【二维点】p=\n" << p << ";\n"<<endl; // 5.2 定义和输出三维点 Point3f p3f(8, 2, 0); cout << "【三维点】p3f=\n" << p3f << ";\n" << endl; // 5.3 定义和输出基于Mat的std::vector vector<float> v; v.push_back(3); v.push_back(5); v.push_back(7); cout << "【基于Mat的vector】shortvec=\n" << Mat(v) << ";\n" << endl; // 5.4 定义和输出基于Mat的std::vector vector<Point2f> points(10); for (size_t i = 0; i < points.size(); ++i) points[i] = Point2f((float)(i * 5), (float)(i % 7)); cout << "【二维点向量】points=\n" << points << ";" ;
二、常用数据结构和函数
1、点:Point类
- Point_<int>、Point2i、Point互相等价
- Point_<float>、Point2f互相等价
2、颜色:Scalar类
- Scalar()表示4个元素的数组,常用于传递像素值,如RGB值,如果只写3个参数,则认为值想表示三个参数
- Scalar(a,b,c)如果定义RGB,则是按BGR的顺序排列的
- Scalar类的源头是Scalar_类,Scalar_类是Vec4x的变种,常用的Scalar是Scalar_<double>,所以有些函数的参数输入可以是Mat,也可以是Scalar。
3、尺寸的表示:Size类
- 如下所示,Size_<int>、 Size2i、Size三者等价
[code]typedef Size_<int> Size2i; typedef Size2i Size;
-
[code]Size(5,5); // 构造出Size宽度和高度都为5(Size.width=5,Size.height=5)
4、矩形的表示:Rect类
-
[code] rect(x,y,width,height) //左上点坐标,和矩形的宽和高
- 可以用他的函数判断一个点(矩形)是否在所给的矩形中或者返回矩形的左上坐标、求两个矩形的交集并集等等。
5、颜色空间转换:cvtColor()函数
- OpenCV存储的RGB的顺序是BGR
三、基本图像的绘制
1、绘制常见的线型
- 绘制直线:line
- 绘制椭圆:ellipse
- 绘制矩形:rectangle
- 绘制圆:circle
- 绘制填充多边形:fillPoly
2、绘制结果图
相关文章推荐
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co
- opencv学习笔记——数据结构与基本绘图
- OpenCV学习笔记 Mat数据操作之普通青年、文艺青年、暴力青年
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年
- [OpenCV学习笔记][Mat数据类型和操作]
- 【OpenCV学习笔记】之三:Mat初始创建方法----要求数据连续存储
- OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCV3学习笔记-数据结构和基本绘图
- 【OpenCV学习笔记】之二:Mat使用的潜规则----对数据类型敏感
- 我的OpenCV学习笔记(23):Mat中实际数据是如何保存的
- OpenCv2 学习笔记(4) OpenCv基本的数据类型
- opencv学习笔记[9]:Opencv的基本数据类型和矩阵结构
- SilverLight学习笔记--关于使用IValueConvert对绑定数据的格式化操作
- JAVA基础 day13 String类和StringBUffer类的常用方法 基本数据类型包装类的学习
- 【VC++ 中使用ADO操作数据库学习笔记】_ConnectionPtr指针的基本用法