OpenCV 简介
OpenCV 是什么?
OpenCV的全称是 Open Source Computer Vision Library,是一个跨平台的计算机视觉库。
OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。
OpenCV可用于解决如下领域的问题: 人机交互 物体识别 图像分区 人脸识别 动作识别 运动跟踪 机器人
OpenCV 和 OpenGL 有什么关系?
这两者名字类似,且都是图像相关的,没接触过的人容易混淆。 OpenGL带open是代表接口跨平台一致、保持开放性。OpenCV带open是指这个库是open source的。 他们所做的事情,以及所做事情所处的层次是不同的。
OpenCV是应用程序层面用来做图像处理的,和硬件层没有关系,主要的工作逻辑是图像数据本身的处理,比如图像变换、物理识别、图像算法。图像最初不是OpenCV生成的、也不是OpenCV渲染的,而是拿到一张照片,进行分析、处理。
OpenGL是驱动层面用来把图像数据渲染图像到显示器屏幕上的,这和显示驱动息息相关。OpenGL的渲染实质是将矢量图转换成位图。
说到图像,其实是有两大类,一类是真实世界采集到的像素集合,即“照片”;另一类是由计算机绘制的矢量图形。
真实世界是三维立体的,而当其被捕捉到计算机上成为像素矩阵之后,三维属性其实已经消失了,OpenCV中的一些算法会去理解这些空间属性。计算机内存不是三维立体的,而计算机以矢量形式存储图像时,三维属性是被以一定形式保存的,OpenGL可以将其以一定的视角渲染到平面屏幕上。
OpenGL的细节可以参考我的另一篇文章OpenGL开发指南
OpenCV基础功能
https://docs.opencv.org/master/de/d7a/tutorial_table_of_content_core.html
基础功能是在像素级别处理一张图片所需要的基本操作。
Mat
Mat是由matrix简写而来的。Mat类可以被看做是opencv中C++版本的矩阵类。
Mat对象是存储一张图片的基本单元,Mat类定义于core.hpp中,主要包含有两部分数据:一部分是矩阵头(matrix header),这部分的大小是固定的,包含矩阵的大小,存储的方式,矩阵存储的地址等等;另一个部分是一个指向矩阵包含像素值的指针(data)。
Mat的存储是逐行存储的,一般一个像素以BGR的顺序构成一个存储单元。
Blob
Blob是binary large object简写而来。
blobFromImage 函数将图片矩阵Mat转换为Blob.
Creates 4-dimensional blob from image. Optionally resizes and crops image from center, subtract mean values, scales values by scalefactor, swap Blue and Red channels.
Parameters
image input image (with 1-, 3- or 4-channels).
size spatial size for output image
mean scalar with mean values which are subtracted from channels. Values are intended to be in (mean-R, mean-G, mean-B) order if image has BGR ordering and swapRB is true.
scalefactor multiplier for image values.
swapRB flag which indicates that swap first and last channels in 3-channel image is necessary.
crop flag which indicates whether image will be cropped after resize or not
Returns
4-dimansional Mat with NCHW dimensions order.
针对像素的Mask操作
使用一个mask matrix 或者叫kernel核,来重算图像中的每一个像素值。比如,核矩阵I(i,j)=5∗I(i,j)−[I(i−1,j)+I(i+1,j)+I(i,j−1)+I(i,j+1)] 是增加图像对比度的一种方法。opencv中的filter2D函数是内置的核操作函数。
OpenCV传统图像处理
https://docs.opencv.org/master/d7/da8/tutorial_table_of_content_imgproc.html
OpenCV高级算法应用
机器学习
Tutorial:
https://docs.opencv.org/trunk/d6/de2/tutorial_py_table_of_contents_ml.html
https://docs.opencv.org/master/d1/d69/tutorial_table_of_content_ml.html
API Ref: https://docs.opencv.org/3.0-beta/modules/ml/doc/ml.html
TrainData这个类,封装了训练数据的存储和操作。
每个训练样本都是一个vector向量,也称作“特征向量”。
每个样本所对应的标签:处理有标签样本的问题是监督学习问题,一个标签可以是标量,也可能是向量。
mask of missing measurements:用来指明哪些样本的哪些部分都是有效的。
setTrainTestSplitRatio方法可以用来做样本集切分。
StatModel这个类是所有机器学习模型的基类模型。
train
predict
calcError : 计算训练集或测试集的预测错误率
save&load : 保存/载入文件形式的已训练模型
下面是OpenCV提供的典型的机器学习方法。
Normal Bayes Classifier
K-Nearest Neighbors
Support Vector Machines
Decision Trees
Boosting
Random Trees
Expectation Maximization
Neural Networks
Logistic Regression
DNN深度学习模块
https://docs.opencv.org/master/d2/d58/tutorial_table_of_content_dnn.html
<opencv2/dnn.hpp>
Net net;
cv::dnn::readNetFromCaffe 从Caffe神经网络模型的prototxt和caffemodel文件中读取NN模型。
prototxt文件是一个树形文本文件,存储的是神经网络的结构设计。 caffemodel文件是满足Google Protocol Buffer标准的二进制文件,存储的是神经网络的权值参数。 synset_words.txt文本文件是ILSVRC的1000个图片分类的名称。cv::dnn::blobFromImage 从图片数据中读取以NCHW [batch, in_channels, in_height, in_width]格式的Mat数据。
net.setInput(inputBlob, “data”); 设置输入
prob = net.forward(“prob”);
图像识别
https://docs.opencv.org/master/d2/d64/tutorial_table_of_content_objdetect.html
opencv3.3.0之后的DNN深度学习模块,用它可以进行图片分类或图片识别。下面这个链接是使用opencv_dnn模块进行图片分类的例子,其中使用的神经网络是Caffe实现的GoogLeNet。
https://docs.opencv.org/master/d5/de7/tutorial_dnn_googlenet.html
人脸检测
https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html
https://docs.opencv.org/master/dc/d88/tutorial_traincascade.html
https://docs.opencv.org/trunk/d7/d8b/tutorial_py_face_detection.html