初识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.
网友评论