OpenCV开发实践

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

*****
Written by Lu.dev on 01 December 2017