1.1源码方式安装OpenCV
1.1.1安装OpenCV
使用OpenCV-3.1.0和Python3环境搭建步骤
步骤0:
打开终端,我们先更新和升级已安装的软件包,然后更新Raspberry Pi固件。
sudo apt-get update sudo apt-get upgrade
等待一段时间后,更新结束,如果你的Linux长时间没有更新,该部分耗时较久。
步骤1:
安装所需的工具和库,笔者在这里一个命令完成上面的很多步骤,请读者朋友注意对比。
sudo apt-get install build-essential cmake pkg-config libjasper-dev libpng12-dev libjpeg-dev libpng-dev libtiff-dev libgtk2.0-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libatlas-base-dev gfortran libjasper-dev libdc1394-22-dev python-dev python-numpy
步骤2:
下载和解压OpenCV:
sudo wget -O opencv-3.1.0.zip http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/3.1.0/opencv-3.1.0.zip/download
【注1】直接下载可能比较慢,读者朋友可以直接到官网去下载源码,再用U盘拷贝到linux中或使用FTP等下载。
链接:https://sourceforge.net/projects/opencvlibrary/files/opencv-unix/
【注2】最新的版本版本是3.3.1,读者朋友只需把3.1.0换成3.3.1即可,其他都是一样的。
sudo unzip opencv-3.1.0.zip cd opencv-3.1.0
安装:
sudo mkdir build cd build sudo cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D BUILD_TBB=ON –D WITH_TBB=ON ..
编译OpenCV:
sudo make
最后,我们安装OpenCV:
sudo make install
更新搜索动态链接库
sudo ldconfig
1.1.2测试程序
【C++】——通过代码载入一张图片,通过opencv把彩色图片转换为黑白图片,并把原图和转换后的图片输出到屏幕中。
/**Includes*********************************************************************/
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
/**namespace********************************************************************/
using namespace cv;
using namespace std;
/**
* @brief 主函数
* @param argc 命令行参数个数
argv 命令行参数
* @retval int
*/
int main (int argc, char **argv)
{
Mat image, image_gray;
//读取图片
image = imread(argv[1], CV_LOAD_IMAGE_COLOR );
if (argc != 2 || !image.data)
{
cout << "No image data\n";
return -1;
}
cvtColor(image, image_gray, CV_RGB2GRAY);
//创建显示窗口
namedWindow("image",CV_WINDOW_AUTOSIZE);
namedWindow("image gray",CV_WINDOW_AUTOSIZE);
//显示图片
imshow("image", image);
imshow("image gray", image_gray);
waitKey(0);
return 0;
}
【makefile】
INCLUDE = $(shell pkg-config --cflags opencv)
LIBS = $(shell pkg-config --libs opencv)
SOURCES = test.cpp
# 目标文件
OBJECTS = $(SOURCES:.cpp=.o)
# 可执行文件
TARGET = test
$(TARGET):$(OBJECTS)
g++ -o $(TARGET) $(OBJECTS) -I $(INCLUDE) $(LIBS)
$(OBJECTS):$(SOURCES)
g++ -c $(SOURCES)
clean:
rm $(OBJECTS) $(TARGET)
# 编译规则 $@代表目标文件 $< 代表第一个依赖文件
%.o:%.cpp
g++ -I $(INCLUDE) -o $@ -c $<
【简要说明】
通过pkg-config –cflags opencv 获得opencv相关头文件路径,通过pkg-config –libs opencv获得opencv扩展库
【编译并执行】
make ./test raspberry.jpg
示例中载入一张名为raspberry.jpg图片。在该示例中,图片和可执行文件test应在同一个目录中。
1.2 apt方式安装OpenCV
1.2.1安装OpenCV
读者也许认为前文的方法比较麻烦,很不容易安装成功,接下来笔者将介绍如何在树莓派中通过apt方式安装OpenCV。相比于源代码方式安装OpenCV,通过apt方式安装过程步骤简单些,消耗的时间也少一些。通过apt方式安装没有自动生成opencv.pc文件,所以在编写makefile文件时不能直接使用pkg-config工具,而需要逐个指定opencv_core、opencv_imgproc等动态链接库。这也是它的劣势所在。
开始之前进行必要的更新工作。
sudo apt-get update
安装源码库。
sudo apt-get install libcv-dev
安装过程比较缓慢,请耐心等待。安装结束后,可以在/usr/include目录下opencv和opencv2下查看opencv相关的头文件(.h),这个是树莓派中默认头文件路径。
opencv的相关动态链接库包括:
【opencv_calib3d】——相机校准和三维重建
【opencv_core】——核心模块,绘图和其他辅助功能
【opencv_features2d】——二维特征检测
【opencv_flann】——快速最邻近搜索
【opencv_highgui】——GUI用户界面
【opencv_imgproc】——图像处理
【opencv_legacy】——废弃部分
【opencv_ml】——机器学习模块
【opencv_objdetect】——目标检测模块
【opencv_ocl】——运用OpenCL加速的计算机视觉组件模块
【opencv_video】——视频分析组件
1.2.2测试程序
【参考附件/apt-get方式】
【C++】——通过代码载入一张图片,通过opencv把彩色图片转换为黑白图片,并把原图和转换后的图片输出到屏幕中。
/**Includes*********************************************************************/
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
/**namespace********************************************************************/
using namespace cv;
using namespace std;
/**
* @brief 主函数
* @param argc 命令行参数个数
argv 命令行参数
* @retval int
*/
int main(int argc,char **argv)
{
Mat image ,image_gray;
//读取图片
image = imread(argv[1],CV_LOAD_IMAGE_COLOR);
if(argc != 2 || !image.data)
{
cout <<"No image data\n";
return -1;
}
cvtColor(image,image_gray,CV_RGB2GRAY);
//创建显示窗口
namedWindow("image",CV_WINDOW_AUTOSIZE);
namedWindow("image gray",CV_WINDOW_AUTOSIZE);
//显示图片
imshow("image", image);
imshow("image gray", image_gray);
waitKey(0);
return 0;
}
【makefile】
CC = g++
# 可执行文件
TARGET = test
# C文件
SRCS = test.cpp
# 目标文件
OBJS = $(SRCS:.cpp=.o)
# 库文件
DLIBS = -lopencv_core -lopencv_imgproc -lopencv_highgui
# 链接为可执行文件
$(TARGET):$(OBJS)
$(CC) -o $@ $^ $(DLIBS)
clean:
rm -rf $(TARGET) $(OBJS)
# 编译规则 $@代表目标文件 $< 代表第一个依赖文件
%.o:%.cpp
$(CC) -o $@ -c $<
【简单说明】
DLIBS = -lopencv_core -lopencv_imgproc -lopencv_highgui
示例中使用了opencv中的核心部分、图像处理部分和GUI部分,所以依次增加opencv_core、opencv_imgproc、opencv_highgui动态链接库。该部分和和【树莓派学习笔记——源代码方式安装opencv】中的示例稍有不同,前文中的makefile使用LIBS = $(shell pkg-config –libs opencv)引入所有的opencv动态链接库,此处手动指定相关库按需链接。
【编译】
make
【执行】
./test image.jpg
可执行文件test和image.jpg应在同一个目录中。
1.3 OpenCV 整体结构
上文讲解了OpenCV的安装,也相应给出了简单的例子。在具体学习OpenCV的具体功能块之前,我们先来看看OpenCV源码的整体框架,这样也能方便我们在后面的学习中获得更加清晰的思路。
1.3.1文件结构
要了解整体框架,切入点在于opencv/build目录下的include文件夹,因为这下面包含了OpenCV源码所有的头文件。include下面有两个文件夹:opencv和opencv2:
不难看出,opencv中存放的是旧版中保留的部分OpenCV的头文件,而opencv2中包含的则是改版之后的OpenCV2的各种头文件。
1.opencv文件目录:
2.opencv2文件目录:
在这个文件夹下面,我们可以看到很多子文件目录,这些目录都是按照功能模块进行头文件整合,相同功能块的放在同一子目录下面,其中opencv_modules.hpp这个头文件中,定义了opencv2中所有模块的宏:
1.3.2功能模块
上面的介绍中我们介绍文件结构的同时,其实也说到了opencv2中的每个子文件夹就对应一个功能模块,那么我们接下来就看看每个功能模块的具体作用,标红为最常用的库文件:
1、【calib3d】——其实就是就是Calibration(校准)加3D这两个词的组合缩写。这个模块主要是相机校准和三维重建相关的内容。基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等等。
2、【core】——核心功能模块,包含如下内容:
OpenCV基本数据结构
动态数据结构
绘图函数
数组操作相关函数
辅助功能与系统函数和宏
与OpenGL的互操作
3、【imgproc】——Image和Processing这两个单词的缩写组合。图像处理模块,这个模块包含了如下内容:
线性和非线性的图像滤波
图像的几何变换
其它(Miscellaneous)图像转换
直方图相关
结构分析和形状描述
运动分析和对象跟踪
特征检测
目标检测等内容
4、【features2d】 ——也就是Features2D, 2D功能框架 ,包含如下内容:
特征检测和描述
特征检测器(Feature Detectors)通用接口
描述符提取器(Descriptor Extractors)通用接口
描述符匹配器(Descriptor Matchers)通用接口
通用描述符(Generic Descriptor)匹配器通用接口
关键点绘制函数和匹配功能绘制函数
5、【flann】—— Fast Library for Approximate Nearest Neighbors,高维的近似近邻快速搜索算法库,包含两个部分:
快速近似最近邻搜索
聚类
6、【gpu】——运用GPU加速的计算机视觉模块
7、【highgui】——也就是high gui,高层GUI图形用户界面,包含媒体的I / O输入输出,视频捕捉、图像和视频的编码解码、图形交互界面的接口等内容
8、【ml】——Machine Learning,机器学习模块, 基本上是统计模型和分类算法,包含如下内容:
统计模型 (Statistical Models)
一般贝叶斯分类器 (Normal Bayes Classifier)
K-近邻 (K-NearestNeighbors)
支持向量机 (Support Vector Machines)
决策树 (Decision Trees)
提升(Boosting)
梯度提高树(Gradient Boosted Trees)
随机树 (Random Trees)
超随机树 (Extremely randomized trees)
期望最大化 (Expectation Maximization)
神经网络 (Neural Networks)
MLData
9、【objdetect】——目标检测模块,包含Cascade Classification(级联分类)和Latent SVM这两个部分。
10、【photo】——也就是Computational Photography,包含图像修复和图像去噪两部分
11、【stitching】——images stitching,图像拼接模块,包含如下部分:
拼接流水线
特点寻找和匹配图像
估计旋转
自动校准
图片歪斜
接缝估测
曝光补偿
图片混合
12、【superres】——SuperResolution,超分辨率技术的相关功能模块
13、【ts】——opencv测试相关代码,不用去管他
14、【video】——视频分析组件,该模块包括运动估计,背景分离,对象跟踪等视频处理相关内容。
15、【Videostab】——Video stabilization,视频稳定相关的组件,官方文档中没有多作介绍,不管它了。
以上就是OpenCV的大体模块,笔者在这里列出的是3.1.0和3.0.0共同所拥有的,总之大体相同,要想深入研究的读者请自行对比吧。看到这里,相信大家已经对OpenCV的模块架构设计有了一定的认识。另外OpenCV的参考例程也是这样分块的。
【注】笔者树莓派(Linux操作系统)用的3.1.0,PC端用的是3.0.0,经过笔者比较,二者区别不大,在后文中有区别的地方笔者会特别指出。