图像处理之 _OpenCV 入门

1. 带着问题看 OpenCV

1) 实现了哪些功能,如何调用?

OpenCV 实现了图像处理(类似 PhotoShop),校正,分割前景背景,视频监控,运动跟踪,人脸识别,手势识别等功能,并支持机器学习算法。和很多开源工具一样,它提供的是很基础的功能。程序开发者利用基本函数的组合,适配场景,实现具体功能。它本身只是一个工具集,不是具体问题的解决方案。

只在应用层面调用的话,知道基本的数据结构,函数接口,就可以了。

2) 如何应用数学知识?

可以把学习 OpenCV 看做应用“数学”的过程,空间,矩阵,微积分,统计等工具都在其中使用。图像处理是应用数学较多的领域,具体实现可以通过源码看到,更重要的是了解数学方法的具体用途,才能举一反三。

了解其中的数学方法,是较深入的层面,如果大学数学都已经忘记了,就很容易卡住,或者似乎明白了,又似乎不明白。不妨把它作为一个切入点,带着这些问题去看数学书,然后会发现数学很有用。OpenCV 还有一个好处是,它能很直观地看到操作之后的效果,用实例理解抽象的概念。

3) 如何组织和处理视觉信息?

OpenCV 在数据存储,压缩,快速处理,数据共用等方面的很多技术很值得借鉴,主要是围绕其原始数据和特征值展开。详见其数据结构,函数,以及流程。

视觉信息对于三维空间,只是单个侧面的投射,想还原真实场景,还需要更多先验知识。虽然 OpenCV 中自带机器学习功能,可以训练对人脸手势的识别,以及测距等等,这些也只是功能点,而未连成面,好像并没有一套逻辑去存储和处理三维空间。

和人对视觉信息的处理,还差得非常远,基本没有可比性。只实现的眼睛的功能,缺少脑子的功能,人工智能训练出来的又往往“不可道,不可名”,在中间还有个断档,比如说分解子任务,总结和存储背景知识等等(个人看法)。

2. 简介

1) 使用

OpenCV 采用 C/C++ 编写,还提供了 Phthon,Ruby,MATLAB,Android 接口。

2) 协议

OpenCV 基于 BSD 协议,可商用,且不强制开放改善后的源码。

3) 组成(具体见源码目录)

  1.         基本数据结构(CXCore)
  2.         图像处理和算法(CV)
  3.         机器学习(ML)
  4.         外部支持:图像视频输入/输出(HighGUI)

3. Ubuntu 系统安装 OpenCV

1) 简单安装

1
$ sudo apt-get install libcv-devapt-get

自动安装了 libcv-dev 的所有依赖库,比较省事。

####2) 源码安装

相对麻烦,但是可以看到源码和例程

  1.         下载

http://wiki.opencv.org.cn/index.php/Download

下载最新的 Android 和 Linux 版本

  1.         安装
1
2
3
4
5
6
$ unzip opencv-3.2.0.zip
$ cd opencv-3.2.0/
$ mkdir release
$ cd release$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
$ make
$ sudo make install
  1.         编译和试用

例程 OpenCV 源码目录/samples/cpp 目录下的例程,编译后可以直接执行看效果

1
2
3
4
5
6
$ cd ../../samples
$ mkdir release
$ cd release
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
$ make
$ ./cpp/cpp-example-ffilldemo

4. 例程

1) 功能

显示一幅图片(最基本的流程,大多数变换都可在此基础上通过添加函数实现)

2) 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <iostream>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>


using namespace cv;
using namespace std;


int main( int argc, char** argv )
{
   string imagename = argv[1];
   Ptr<IplImage> iplimg(cvLoadImage(imagename.c_str()));
   if(!iplimg)
    {
       fprintf(stderr, "Can not load image %s\n", imagename.c_str());
       return -1;
    }
   namedWindow("image", WINDOW_AUTOSIZE);
   cvShowImage("image", iplimg);
   waitKey();
   return 0;
}

3) 编译执行

1
2
$ g++ test.cpp -o test `pkg-config --cflags --libs opencv`
$ ./test

5. 参考

《学习 OpenCV》中文版(清华大学出版杜)