零cpp基础的小白探索OpenCV从从入门到放弃的摸鱼记录从这里开始。
参考书:《OpenCV3编程入门》毛星云、冷雪飞 等编著 电子工业出版社
一、OpenCV(Open Source Computer Vision Library)开源计算机视觉库
一个开源的机器视觉、图像处理的SDK(Software Development Kit / 软件开发工具包),支持C、C++、Python、Ruby等多种编程语言。
二、常用OpenCV头文件
1、<opencv2/core/core.hpp>
OpenCV核心组件,核心功能模块。包含基本数据结构(如Mat、Rect等)、基本绘图操作、像素操作、ROI设置、图像混合、DFT(Discrete Fourier Transform)等
2、<opencv2/imgproc/imgproc.hpp>
OpenCV图像处理组件。包括图像滤波、直方图、特征检测、图像变换等等
3、<opencv2/highgui/highgui.hpp>
OpenCV高层GUI图形用户界面模块。包括图像载入、显示、写入、滑动条、鼠标操作等
4、<opencv2/opencv.hpp>
此头文件定义包括以上三个在内的多个头文件,为了简化代码使用。本小白入门被建议不使用它。
三、OpenCV核心数据结构
1、Mat类
OpenCV中图像储存的类,实为矩阵。由矩阵头(包括矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素的矩阵的指针两个部分组成。因此 Mat类在复制上有一个需要注意的点,赋值运算符和拷贝构造函数只复制信息头,并不复制图像本身储存信息。如
Mat A,C;
A = imread("1.jpg",CV_LOAD_IMAGE_COLOR);
Mat B (A); //拷贝构造函数
C = A; //赋值运算符
以上A、B、C最终都指向同一个也是唯一一个数据矩阵。虽然信息头不同,但通过任何一个对象所做的改变也会影响其他对象。真想要复制应使用Mat的成员函数,如下
Mat F = A.clone();
Mat G;
A.copyTo(G);
这样使用,改变F或者G就不会影响Mat信息头所指向的矩阵了。
Mat有多个非常有用的常用成员函数:
M.cols 返回矩阵列数
M.rows 返回矩阵行数
M.total() 返回矩阵元素数(不考虑多通道)
M.channels() 返回矩阵通道数
M.size() 以size类返回矩阵的尺寸
M.at 对矩阵元素进行访问