OpenCV3.2交叉编译

关于OpenCV版本

OpenCV从2.x版本到3.x版本之间有很大的改动变化,导致api之间的不兼容比较明显。网上很多关于OpenCV的文章资料代码等大部分是基于2.x版本的,毕竟2.x版本已经成功应用了将近十年的时间。但是3.x版本的OpenCV对模块和api进行了更好的整理,显得更清晰,使用起来也更加的便利,单从这一点,个人觉得还是可以考虑采用3.x的OpenCV来进行开发使用。更不用说更多新算法和功能被添加到3.x版本了。

下载与学习参考

最佳链接自然是官网 : OpenCV,从官网进行下载与文档的学习是最准确可靠的。

当然网上也有很多的博客文章讲述OpenCV的Demo以及应用,尤其是在机器学习方面的文章,如CSDN这块的专栏就有很多这方面的文章,毕竟在图像处理和机器学习方面,OpenCV是最成功的开源库之一。

编译构建

OpenCV项目采用cmake构建工具,因此编译步骤其实是很简单方便的,只要稍微熟悉cmake的使用就可以。当然首先就是在你的主机上安装cmake工具。

apt-get install cmake # on ubuntu

PC/Linux编译安装

OpenCV3.2中使用了zlib库,首先需要安装zlib库的开发版本以提供zlib.h头文件:

apt-get install zlib1g-dev # on ubuntu

然后解压OpenCV压缩包,进入到OpenCV-3.2.0版本目录中,建立编译构建目录:

mkdir x86_release && cd x86_release

接下来只需要执行简单的cmake以及make构建命令就可以了:

cmake .. && make && make install

这样就将编译和安装opencv头文件和库到系统默认的安装位置,获取库的编译链接选项:

    lzh@ubuntu:~/opencv-3.2.0$ pkg-config --cflags --libs opencv
-I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core

OpenCV的highgui模块需要使用窗口系统,所以系统需要安装QT或者是GTK+相关的一些库,比如glib2等。如果没有安装,会提示找不到对应的文件,根据提示进行安装就可以。

交叉编译与模块裁剪

zlib交叉编译

同上原因,需要先对zlib库进行交叉编译,zlib库可以从官网下载源码包也可以从仓库下载:

apt-get source zlib1g-dev # on ubuntu, source.list need has deb-src

zlib项目既支持configure方式的构建,也支持cmake方式的构建,因为cmake方式的交叉编译更方便简洁,我们采用cmake方式来完成交叉编译,首先创建一个交叉编译的cmake环境配置文件toolchain.cmake,内容如下:

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_C_COMPILER "arm-hisiv500-linux-gcc")
SET(CMAKE_CXX_COMPILER "arm-hisiv500-linux-g++")

该文件指定了交叉编译的编译器与系统。然后创建构建目录,使用cmake命令构建就可以了。

mkdir 3519v101_build ; cd 3519v101_build
cmake ../ -DCMAKE_TOOLCHAIN_FILE=./toolchain.cmake
make

这样在构建目录中就有了libz.so库文件,至于zlib.h的头文件,从源码中拷贝就好了,因为zlib.h中包含了zconf.h头文件,还需要从构建目录中拷贝zconf.h文件。这些文件应该拷贝到哪里去呢?

因为Opencv执行交叉编译时,它会从工具链安装的位置去找工具链相关的依赖库以及头文件,因此我们需要把这些文件安装到工具链系统目录中去,如下:

sudo cp -arf libz.so* /opt/hisi-linux/x86-arm/arm-hisiv500-linux/target/lib/
sudo cp zlib.h zconf.h /opt/hisi-linux/x86-arm/arm-hisiv500-linux/target/usr/include

注意:拷贝库文件时,需要把对应的软连接文件也一起拷贝过去(-arf),不然应用运行时会提示找不到对应的库文件。

opencv交叉编译

首先自然是创建构建目录以及交叉编译的cmake环境配置文件toolchain.cmake,内容如下:

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_C_COMPILER "arm-hisiv500-linux-gcc")
SET(CMAKE_CXX_COMPILER "arm-hisiv500-linux-g++")

# 选项配置
OPTION(ENABLE_SSE                 "Enable SSE instructions"  OFF)

# 模块的裁剪
SET(BUILD_opencv_highgui_INIT OFF) # 不需要highgui模块
SET(BUILD_opencv_videoio_INIT OFF) # 不需要videoio模块

OpenCV项目有很多的构建选项可以进行配置,具体的选项可以阅读项目根目录下的CMakeLists.txt文件。

这些选项可以手动指定配置,但其实更多的可以依赖于构建平台来自动配置,项目构建系统会自动地检测构建平台然后配置相关的选项,所以基本需要进行太多的配置。

但是opencv的模块默认是全部构建的,而在嵌入式中,我们一般会不需要一些模块,比如highgui模块,以及videoio模块等,通过cmake中的模块选项,可以对构建模块进行裁剪。在项目cmake目录下的OpenCVModule.cmake文件中,有这样的描述:

# name       - short name in lower case i.e. core
# the_module - full name in lower case i.e. opencv_core

# To control the setup of the module you could also set:
# the_description - text to be used as current module description
# the_label - label for current module
# OPENCV_MODULE_TYPE - STATIC|SHARED - set to force override global settings for current module
# OPENCV_MODULE_IS_PART_OF_WORLD - ON|OFF (default ON) - should the module be added to the opencv_world?
# BUILD_${the_module}_INIT - ON|OFF (default ON) - initial value for BUILD_${the_module}
# OPENCV_MODULE_CHILDREN - list of submodules

因此可以通过是设置BUILD_${the_module}_INIT变量的值来选择自己需要的模块。

编写好toolchain.cmake后,就可以一键构建opencv的模块了:

mkdir 3519v101_build;cd 3519v101_build
cmake ../ -DCMAKE_TOOLCHAIN_FILE=./toolchain.cmake
make opencv_modules 

构建所有选择的模块,也可以单独构建需要的模块,如:

make opencv_core

构建目录中的opencv2/opencv_modules.hpp文件包含了选择的模块对应的宏,是自动生成的不能改该文件。编译出来的库文件在lib目录中。

交叉编译一般不需要安装,我们可以使用PC系统上安装的opencv来提供头文件,链接的时候通过制定对应的链接目录来链接交叉编译的库文件。 当然也可以对交叉编译进行安装,只需要在toolchain.cmake文件中设置一下构建的安装目录前缀就可以了,这样头文件和库文件就会安装到对应的目录中。

Samples编译与使用

设置BUILD_EXAMPLES选项为ON即可,默认该选项是OFF的

OCV_OPTION(BUILD_EXAMPLES           "Build all examples"                          OFF )

opencv默认的编译构建中并没有保护samples示例的构建,需要对samples进行单独的构建测试。

对pc上的编译,我们只需要进入samples目录,执行简单的cmake和make命令就可以了,构建系统会自动从系统中找到安装好的opencv库依赖。

但是对于交叉编译,这样的构建会失败,而与上面的交叉编译流程一样的步骤好像也行不通,可能与库的依赖有关,因此只能退而求其次,将需要使用的samples文件单独编写makefile进行编译。目前而言,由于cpp中的samples都是单文件的方式提供的,因此还是很简单的。

下面是一个简单的samples构建makefile文件:

target = cvfacedetect

ARCH ?= 3519v101

## pc-linux
ifeq ($(ARCH),x86)
CC = g++
LIBS = -lopencv_core -lopencv_imgproc -lopencv_imgcodecs -lopencv_objdetect
TARGET = $(target)_x86
endif

## 3519v101
ifeq ($(ARCH),3519v101)
CC = arm-hisiv500-linux-g++
LIBS= -L../3519v101_build -lopencv_core -lopencv_imgproc -lopencv_imgcodecs -lopencv_objdetect -Wl,-rpath=../3519v101_build
TARGET = $(target)_3519v101
endif

CFLAGS = -O2 -g -I./ -I../include/ -std=c++11 -I/usr/local/include/opencv -I/usr/local/include

all:$(TARGET)

$(TARGET):facedetect.cpp
        $(CC) -o $@ $^ $(CFLAGS) $(LIBS)

clean:
        rm $(TARGET)

转载于:https://my.oschina.net/shelllife/blog/1835438

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值