【第一部分-环境搭建】OpenCV环境搭建(Linux)

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),这个是树莓派中默认头文件路径。

这里写图片描述

图1-1

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:

这里写图片描述

图1-2

不难看出,opencv中存放的是旧版中保留的部分OpenCV的头文件,而opencv2中包含的则是改版之后的OpenCV2的各种头文件。
1.opencv文件目录:
这里写图片描述

图1-3

2.opencv2文件目录:
这里写图片描述

图1-4

在这个文件夹下面,我们可以看到很多子文件目录,这些目录都是按照功能模块进行头文件整合,相同功能块的放在同一子目录下面,其中opencv_modules.hpp这个头文件中,定义了opencv2中所有模块的宏:
这里写图片描述

图1-5

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,经过笔者比较,二者区别不大,在后文中有区别的地方笔者会特别指出。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bruceoxl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值