初识OpenCV
OpenCV简介:
OpenCV (Open Source Computer Version)
是一个基于开源的跨平台的计算机视觉库,可以实现图像处理和计算机视觉方面的很多通用算法。
OpenCV
官方主页:http://opencv.org
OpenCV Github
主页:https://github.com/Itseez/opencv
OpenCV
开发版 Wiki 主页:http://code.open.org
Opencv
可以解决如下领域问题:人机交互、物体识别 、图像分区 、人脸识别、动作识别、运动追踪、机器人。
OpenCV
常见模块介绍:
calib3d
———Calibration
(校准)和3D的组合缩写,主要是相机校准和三维重建相关的内容。包括基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等。contrib
———Contributed / Experimental Stuf
的缩写。该模块包含了一些最近添加的不太稳定的可选功能。如人脸识别,立体匹配,人工视网膜模型等技术。core
——— 核心功能模块,主要包含:Opencv
基本数据结构、动态数据结构、绘图函数、数组操作相关函数、辅助功能与系统函数和宏、与OpenGL的互操作。imgproc
———Image Process
,图像处理模块。主要包含线性与非线性的图片滤波、图像的集合变换、其他图像变换、直方图相关结构分析和形状描述、运动分析和对象追踪、特征检测、目标检测等内容。features2d
———Features2D
,也就是Features 2D
,即2D
功能框架,包含如下内容: 特征检测和描述 特征检测器通用接口,描述符提取器通用接口 描述符匹配器通用接口 通用描述符匹配器通用接口 关键点绘制函数和匹配功能绘制函数flann
高维的近似快速搜索算法库,主要包含: 快速近似最近邻搜索和聚类gpu
——— 运用GPU 加速的计算机视觉模块highgui
——— 高层 GUI 图形用户界面,包含媒体的输入和输出、视频捕捉、图像和视频的编码解码、图形交互的接口等内容。legacy
——— 一些已经废弃的代码库,保留作为向下兼容使用。ml
———Machine Learning
机器学习模块,基本上是统计模型和分类算法,包含如下内容:统计模型、一般贝叶斯分类器、K-近邻、支持向量机、决策树、提升、梯度提高树、随机数、超随机数、期望最大化、神经网络、MLData。non free
——— 一些具有专利的算法objdetect
——— 目标检测模块,包含 Cascade Classification (级联分类)和 Latent SVM 这两个部分photo
——— Computational Photograpy,包含图像修复和图像去噪两部分stitching
——— images stitching, 图像拼接模块suppers
——— superResolution, 超分辨率的相关功能模块ts
——— OpenCV 测试相关代码video
——— 视频分析组件Videostab
———视频稳定相关组件
Opencv 头文件
opencv.hpp
中已经包含了OpenCV
各个模块的头文件,,我们在编写core
, objdetect
, imgproc
,photo
,vedio
,features2d
,calib3d
,ml
,highgui
,contrib
等模块应用程序时,原则上仅写上一句#include <opencv2/opencv.hpp>
即可,这样可以精简代码。
命名规范
- 类名,类型定义,包括枚举和
typedef
,混合使用大小写,首字母大写。 如ClassName
,TypeName
- 局部变量混合使用大小写,首字母小写,其名字应该与底层数据类型无关,并且应该反映该变量所代表的事物。如 localVariable
- 函数名混合使用大小写,首字母大写。如 ChildFunc
- 对类的多个子程序可见的成员变量名用m_前缀表示 如m_ClassVariable
- 全局变量名 用g_ 前缀。 如 g_GlobalVariable
- 具名常量全部大写。 如 CONSTANT
- 宏全部大写,单词间用分隔符”_” 隔开。 如 SCREEN_WIDTH
常见的关键字字母组合包括:
-
Max
最大值 -
Min
最小值 -
Init
初始化 -
T(Temp)
临时变量 -
Src
源对象 -
Dst
目的对象
虽然命名规则在这里,但是我们在应用中切记不要迂腐,不要墨守成规,该变通的时候还可以做适当的变通。
agrc与argv 认识
argc 和 argv[] 中的arg 指的是”参数”, 其中,argc为整数,用来统计运行程序时送给main函数的命令行的个数,默认值为1(程序的全路径名)。argv[ ] 表示字符串数组,用来存放指向字符串参数的指针数组,每一个元素指向一个参数。这两个参数在用命令行编译是有效。
图片的声明,读取和显示
简单体验
1.声明一副图像:
Mat srcImage;
-
读取图片
srcImage = imread(“PathOfImage”);
-
显示图像
imshow(“Title”,srcImage);
图像的简单处理:
-
图像腐蚀:
Met element = getStructuringElement(MORPH_RECT, Size(15,15)); // 设置参数 erode(srcImage, dstImage, element); // 进行图像腐蚀
-
图像模糊:
blur(srcImage,dstImage,Size(7,7));
-
边缘检测
cvtColor(srcImage,garyImage,CV_BG2GRAY);// 将图像转换为 灰度图像 blur(grayImage,edge,Size(3,3));//对灰度图像使用 3* 3 内核来降噪 Canny(edge, edge, 3, 9, 3); // 进行边缘检测
由视频/相机采集图像
VideoCaputure capture(“1.avi”); // 读入视频
// VideoCapture capture(0) 调用摄像头
while(1){
Mat frame; // 定义Mat变量,用于存储每一帧图像
capture >> frame; // 读取当前帧
imshow(“读取视频”, frame); // 显示当前帧
waitKey(30); // 延迟30ms
}
图像的载入,显示和输出
Imread 函数
函数原型为: Mat imread( const String& filename, int flags = IMREAD_COLOR );
其中第一个参数const String &
类型的 filename
,填我们需要载入的图片路径。Opencv
的imread
函数支持如下类型的图像载入。
Windows bitmaps - *.bmp, *.dib (always supported)
JPEG files - *.jpeg, *.jpg, *.jpe (see the Notes section)
JPEG 2000 files - *.jp2 (see the Notes section)
Portable Network Graphics - *.png (see the Notes section)
Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
Sun rasters - *.sr, *.ras (always supported)
-
TIFF files - *.tiff, *.tif (see the Notes section)
第二个参数,int 类型的 flags,为载入标识,它指定加载图像的颜色类型,可以看到其默认值为1,所有这个参数可以缺省。如下为enum ImreadModes { IMREAD_UNCHANGED = -1, //这个标识在新版本已被废弃,可以忽略 IMREAD_GRAYSCALE = 0, //将图像转换成为灰度图 IMREAD_COLOR = 1, //总是将图像转换为彩色再返回 IMREAD_ANYDEPTH = 2, //如果 载入图像深度为16位或者32位,就返回对应深度的图像。否则转换为8位图像返回 };
如果不在上述枚举范围内取值,可以按照如下方式进行:
- flags > 0 返回一个三通道彩色图像
- flags = 0 返回灰度图像
- flags < 0 返回Alpha 通道的加载图像
imshow函数
void imshow(const String& winname, InputArray mat);
第一个参数: const String&
类型的winname
,填需要显示的图像标识名称。
第二个参数:InputArray
类型的 mat
, 填需要显示的图像。函数原型中的InputArray
可以简单的当做Mat
类型即可。
imshow
函数用于在指定的窗口中显示图像。如果窗口用的而是CV_WINDOW_AUTOSIZE
(默认值)标识创建的,那么显示图像的原始大小。否则,将图像以合适窗口缩放。
- 如果载入图像是8为无符号类型,显示图像原来样子。
- 如果图像是16位无符号类型或32位整形,用像素数除以256。也就是说,该值范围从[0, 255 * 256]映射到[0,255]。
- 如果图像是32位浮点数,像素便要乘以255.也就是说该值范围是从[0,1]映射到[0,255]
namedwindow()函数
namedWindow 的作用是通过制定窗口的名称,创建一个可以作为图像或者进度条的容器窗口。
函数原型:
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
第一个参数const String &
类型的 name
,填写被用作窗口的标识符的窗口名称。第二个参数,int
类型的flags
,窗口的标识,可以填写以下值:
WINDOW_NORMAL = 0x00000000, 用户可以改变窗口大小
WINDOW_AUTOSIZE = 1, 窗口大小会自动调整,以适应所显示的图像,并且用户不能手动改变窗口大小
WINDOW_OPENGL = 0x00001000, 窗口会支持OpenGL
imwrite 函数
imwrite
函数用于将图像保存到制定的文件。图像格式是基于文件扩展名的,可以保存的扩展名和imread中可以读取的图像扩展名一致。
bool imwrite( const String& filename, InputArray img,
const std::vector<int>& params = std::vector<int>());
第一个参数,const String &
,类型的filename
, 填写需要写入的图像数据。注意,要带上后缀。
第二个参数,InputArray
类型的 img
,一般填一个Mat类型的图像数据。
第三个参数,为特定格式保存的参数编码。
对于JPEG
格式的图片,这个参数表示从0 到100 的图片质量。默认值为95。
对于PNG
格式的图片,这个参数表示压缩级别从0 到9。 较高意味着更小的压缩尺寸和更长的压缩时间。
对于 PPM
,PGM
和PBM
格式的图片。这个参数表示二进制格式标识,取值为0或者1,默认值为1.