欢迎光临~湖南智能应用科技有限公司-hniat.com
语言选择: 中文版 ∷  英文版

基础知识

计算机视觉的开源框架,OpenCV简介

计算机视觉(Computer Vision,CV),是通过电脑算法去识别图像的一门学科。

图形图像在计算机上的应用,大概分为三个方面。

与图像的显示效果相关的,叫计算机图形学(Computer Graphics)。

与图像的压缩相关的,叫图像编码(image encoder)。经常说的H264、H265、VP8,都是图像的编码算法。

编码,都有对应的解码,它们是紧密关联的一个分支。

与图像的识别相关的,就叫计算机视觉(CV)。

OpenCV,是一个开源的计算机视觉框架。最早由intel发起,第一版使用C编写,从第二版开始改用C++编写。

C语言没有构造函数和析构函数,在需要矩阵计算的软件上,用起来很不方便。

著名的数学软件MATLAB,也是C++写的。

C++在科学计算领域,具有不可替代的地位。

Lena

这是一张在CV领域使用很广泛的图片,来自OpenCV自带的文件。

Lena,是这个女子的名字,拍这张照片时她还很年轻,但这张照片是50年前拍的,可见国外对计算机视觉的研究很早

这也是一门古老的学科,在计算机诞生不久,人们就试图让它模拟人类的眼睛

然后,人们就发现,让计算机“看东西”这个功能,实现起来非常有难度

因为当时对人类视觉的深层原理(眼睛和大脑是怎么处理信息的),完全没有认识。

随着研究的进行,人们对图像的认识逐渐增多,形成了一套与图像相关的传统算法。由intel发起,最后开源给了业界,这就是OpenCV。

传统算法,都是可以给出完整解释的,以区别于暂时解释不了的深度学习模型。

在2016年以后,深度学习的应用越来越广泛,OpenCV里也添加了CNN之类的模块,可以与Tensorflow、Caffe2这些框架训练出来的模型对接。

OpenCV的架构,大概包含这么几块:

1,highGUI,这是个图形界面,用于显示图像效果的。

有了highGUI,就可以直观的查看处理之后的效果。

它常用的API是imshow(),显示图像。

图像数据要提前存放到一个矩阵里,把矩阵的引用传给imshow()函数。

2,core,这是opencv的基础模块,实现了很多最基本的数据结构和算法。

OpenCV的矩阵类Mat,就是定义在这个模块。

矩阵的加减乘除,也是在这个模块实现的。还有一些常用的其他运算,例如均值,方差,等等。

3,imgcodecs,图像的编解码。

它的常用API有两个:

imread(),读取一个图像文件,返回结果是一个存储了图像数据的矩阵。这个函数会自动做图像的解码

imwrite(),把存储了图像数据的矩阵,写为一个图像文件。例如jpg、png格式的图片。它会自动做图像的编码

这两个函数,再加上imshow(),就可以读写和显示图片了。

OpenCV不但可以读写图片,还可以读写视频。它可以把视频的每一帧读取为一个矩阵,也可以一帧帧的写入视频文件。

4,imgproc,图像处理,

这是OpenCV的关键模块,实现了很多的图像处理算法。

例如,高斯模糊、拉普拉斯变换、中值滤波、双边滤波,等等。

高斯模糊,GaussianBlur,也就是通常说的磨皮,在美颜算法中使用广泛。

它是通过计算中心像素(上图的紫色)与它周围像素(上图的蓝色和橘色)的加权平均值,来作为中心像素的新值。

权值的大小,依赖于离中心像素的远近,上图相同颜色的格子权值相同。通过二维高斯分布来计算。

经过高斯模糊之后,图像变得更平滑,即像素之间的差异更小。

如果脸上有青春痘的话,青春痘就会被磨平,变得不明显,所以叫磨皮

拉普拉斯变换,Laplacian,多用于图像的边缘检测

公式如上。

在图像变化比较平缓的地方,这个导数的值很小。

在图像变化剧烈的地方,这个导数的值很大。

在图像的边缘(图像中不同取域的交界线附近),拉普拉斯变换的效果特别明显。所以,它多用于边缘检测和图像分割

如图,人的脸部轮廓还是看得出来的,尤其是眼睛附近。

中值滤波,medianBlur,它的作用主要是处理椒盐噪声

椒盐噪声,就跟往菜上撒花椒面一样,数量少,但很显眼。

中值滤波,是以一个区域的像素值的中位数,作为中心像素的值。数量少的椒盐噪声,不可能是中位数,就会被过滤掉。

双边滤波,bilateralFilter,这是计算量最大的常用滤波方法。它同时参考了像素之间的位置差异和颜色差异,也是滤波效果最好的。

右边的是双边滤波之后的

左边是原图,右边是双边滤波之后的照片(汗)。

原图是网上找的,特意找了个斑点比较多的(笑)。

5,局部特征点检测,features2d,

局部特征点,主要用于图像的匹配。

图像在经过变化之后,它的总体特征是有变形的。

例如,因为摄像头的角度不同,拍出来的图片会有不同的变化。

这两张图来自OpenCV的自带图片,都是国际象棋的棋盘,但是拍摄的角度不一样。

怎么判断它们是同一个东西?

这时就要用到在变化之下不变的特征,即局部的极值点。

极值点,与它周围像素的关系,在平移和旋转变换下是不会改变的。

如果有很多个极值点可以互相匹配,就可以认为两张图片来自于同一个物体。

与极值有关的图像特征,可以选SIFT算法或SURF算法,它们在OpenCV中都有实现。

OpenCV有OpenCV2、OpenCV3、OpenCV4三个大的分支,API有一些变化,但基本还是类似的。

它的源代码是C++写的,也提供了其他语言的API接口,底层依然是调用c++的opencv库。

"学习OpenCV 3 (中文版)",是最新的权威著作。

作者布拉德斯基(Bradski),他也是之前的学习OpenCV那本老书的原作者。

布拉德斯基的书,既有OpenCV框架的API用法,也有背后的原理的讲解,例如三维视觉的对极几何,摄像机的标定,等等。

他的学习OpenCV系列,是计算机视觉领域很好的入门书。

这个领域本身就是有一定的难度的,但没有NLP难。

关闭
用手机扫描二维码关闭
二维码