首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CV干货来袭

Opencv是著名的计算机开源视觉库,最早由Intel发起,由C语言编写,随后的Opencv2由C++语言进行重构,一路高歌猛进到Opencv2.4的时代,几乎所有CV算法都可以在Opencv中找到。后来推出了Opencv3不再那么激进,将代码仓库拆分成两部分:稳定的版本将更新到主仓库,而CV领域相对较新、实现还不够稳定的算法都被移入Opencv_Contrib库中。

打开Opencv主页,今日的Opencv环境配置已经十分方便,尤其是在Windows平台上,只需要下载exe就可以安装。

但是为了让新手更加深入的了解,我们选择自己编译一份Opencv的库出来。Opencv的源代码可以从Github上下载到。首先要用到CMake工具,这里不需要你会编写Cmake,只需要懂得怎么使用即可。

Opencv官网的exe安装包支持vc14和vc15,而且只支持x64,为了编译出跟官网几乎一样的库,我们设置好源代码路径和要生成的库的路径,点击Configure选择vc15 win64作为编译器,选择Finish开始配置Cmake。

因为协议原因,部分第三方库并没有包含在Opencv的代码库当中,所以配置Cmake过程中会下载一些第三方库,以Windows平台为例,需要联网下载的

opencv_ffmpeg.dll、opencv_ffmpeg_64.dll、ffmpeg_version.cmake

ippicv_2017u3_win_intel64_general_20170822.zip

这些是否下载成功只和网络环境有关,而且即使下载失败也不会影响到Opencv的主要功能。

出现Configuring done则说明成功,现在可以看到很多红色的编译选项,红色代表新增,这些编译选项可以自由配置,这里首先需要灌输一个概念:Opencv是由很多模块组成的。

列举几个比较常见的:

opencv_core -定义基本数据结构的紧凑模块,包括密集的多维数组Mat和所有其他模块使用的基本功能。

opencv_imgproc -一个图像处理模块,包括线性和非线性图像过滤,几何图像转换(调整大小,仿射和透视变形,通用的基于表格的重新映射),色彩空间转换,直方图等。

opencv_calib3d -基本多视图几何算法,单个和立体相机校准,对象姿态估计,立体对应算法和三维重建元素。

opencv_feature2d -显着特征检测器,描述符和描述符匹配器。

opencv_highgui -简单的用户界面功能的简单易用的界面。

opencv_ml -机器学习模块,包含常用的机器学习算法

想要查看opencv所有的模块可以参考https://docs.opencv.org/master/modules.html

在配置Opencv过程中,我们有选择地进行勾选这些编译选项的,有些我们用不到的模块并不需要勾选它,甚至可以只勾选一个opencv_core把opencv当作一个c++的矩阵库来使用。

而作为学习环境,一般都会选择勾全。

可选的编译选项是非常多的,除了选择性的编译opencv的模块,还包括语言支持还其他与库本身相关的配置,例如

编译Opencv对Python2、Python3、Matlab、java语言的支持,科研用python比较多,也有相当多的人在用java开发opencv,做手机端的相关cv的内容(比方开发一个美颜App或者AR程序)。

此外,可以选择编译opencv的example,有C/C++/Python的例子可以勾选。

你还可以选择是否生成代码文档,但是必须先安装doxygen,doxygen是代码注释自动生成文档的工具之一,在大型项目中这类工具的使用是很有必要的。

此外,构建Opencv工具支持会涉及到大量其他模块,图像处理跟线性代数密不可分。Opencv在编译时可以选择是否依赖BLAS和Eigen,这是被广泛应用两个线性代数库。其中BLAS已经被各大主流系统预装,在有的系统下,数值程序包LAPACK直接包含了BLAS,它有非常多的实现版本,有Fortran语言版本的,也有C语言版本的,在英伟达的CUDA中,也有其实现版本,叫作cuBLAS,用于GPU的线代运算。

Eigen是一个非常优秀的C++矩阵库,他不依赖于C++STL,也不依赖任何库,只包含头文件。如果你只是想拥有一个线性代数库不必单独编译opencv_core模块,使用Eigen比opencv的cv::Mat要快得多。这里非常推荐C++语言使用者使用Eigen来编写有关求解线代的程序。

opencv最开始是作为CPU密集运算设计的,那会儿还没有GPU这个说法,如今opencv构建了对英伟达CUDA加速的支持,如果你勾选了这个选项,可以使用cv::cuda::去调用GPU版的opencv API,速度提升有时很明显有时反而更慢,这涉及到并行计算和CUDA加速的内容,不属于这里讨论的范围。

内容千千万,这里需要结合你自己的业务需求和任务场景去配置属于自己的开发环境,最后一个至关重要的是编译类型,debug还是release,也在编译选项中,这会直接影响编译出来的库支持哪种模式还是都支持。

让我们把关注点回到opencv本身,关于opencv_contrib库需要配置目录,继续点Configure,然后继续配置,opencv_contrib库中有很多主仓库没有的算法,内容肯定是最新的但不保证稳定,opencv的有些算法还在受专利保护,需要编译nofree模块才能使用。

Configure完所有的编译选项,单击生成编译项目,单击用自动使用VS2017打开,按照上图操作(写不动了)。编译需要很久,继续放图...

查看对应的安装路径(C:\Opencv3\install\)下的文件夹,看起来是不是很眼熟,嗯这就是我们要的opencv库,经过私人定制,更加符合我们的需求。

到了这一步,opencv的源代码、编译文件、中间文件全部可以删掉,只保留这200MB左右的库即可。虽然这里的路径跟官网(..\opencv\build\)略有不同,但是换汤不换药。

include/ 是头文件,我相信你知道该怎么做

x64/下面应该是vc15,因为我们使用vc15编译的

x64/vc15/bin/ 是需要添加到环境变量中的

x64/vc15/lib/ 是需要链接到库路径中的,目录下的**.dll则是被链接的对象

至此,opencv的配置工作就算彻底完成了。

如果用Linux如何描述我们刚才做的事情?首先是依赖库的构建:

用于编译opencv的工具:build-essential

要求必装的依赖:Cmake、git、libgtk2.0-dev、pkg-config、libavcodec-dev、libavformat-dev、libswscale-dev

其他的为可选择的依赖:包括之前提到的Eigen即libeigen3-dev,还有python-dev、python-numpy等等

mkdir build

cd build

## 新建一个文件夹

cmake -D = -D = …

## 这里的对应Cmake GUI中的内容

Make ## 编译

make install ## 将头文件和库文件安装到相应目录

至此,安装完成。

当然,在linux下也可以安装cmake gui完成一样的工作。

而如何配置opencv呢?我们极力推荐使用cmake工具编译工程,编CMakeLists:

# 对cmake的版本要求

cmake_minimum_required(VERSION 2.8)

# 定义项目名称

project(learnopencv)

# 设置一些选项,例如开启C++11 支持

set(CMAKE_CXX_FLAGS "$ -std=c++11 ")

# 寻找opencv的包

find_package(OpenCV REQUIRED)

# 输入一些信息,包括版本、头文件路径和库

message(STATUS "OpenCV library status:")

message(STATUS " version: $")

message(STATUS " include path: $")

message(STATUS " libraries: $")

# 将opencv的头文件路径包含进来

include_directories($)

# 设置当前文件夹为源代码的路径

aux_source_directory(. DIR_SRCS)

# 添加要源码编译的可执行目标

add_executable(leranopencv $)

# 给程序链接到opencv的库

target_link_libraries(leranopencv $)

可以看到,我们一直在做两件事情:

- 让自己的代码可以寻找到opencv的头文件

- 让自己的代码可以连接到opencv的库文件

这两件事如果没有完成,前者会报编译错误,后者会报链接错误。

后记:

写这篇文章的动机,不光是为了做一篇opencv的教程,更是希望能够授人以渔,其实只要掌握了一定套路,配置任何开发环境都不是问题。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180202G0FKOR00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券