交叉编绎OpenCv之OpenCv编绎

       上一篇介绍了如何交叉编绎ffmpeg,本篇介绍如何配置和编绎OpenCv。

1、编绎环境

宿主机:ubuntu12.04 x64 3.5.0-44-generic
交叉编绎器:arm-linux-gcc 4.6.2
目标平台:FreeScale I.MAX6 4核1.2G

2、准备工作

            下载以下源码:

bzip2-1.0.6.tar.gz

yasm-1.2.0.tar.gz

  OpenCV-2.4.3.tar.bz2

3、开始编绎

         将下载源码包放到/opt/EmbedSky/freescale/E9/document/OpenCv目录下,下面开始编绎过程

         1、编译libz库

tar zxvf bzip2-1.0.6.tar.gz -C ./
cd bzip2-1.0.6/







         修改Makefile如下内容:

# To assist in cross-compiling

CC=arm-linux-gcc

AR=arm-linux-ar

RANLIB=arm-linux-ranlib

LDFLAGS=

BIGFILES=-D_FILE_OFFSET_BITS=64

CFLAGS=-Wall -Winline -O2 -g $(BIGFILES)

#注意:64位下,上面一句-O2 需改为-O3 加上-fPIC

# Where you want it installed when you do 'make install'

PREFIX=/opt/EmbedSky/freescale/E9/document/OpenCv/__install

#屏蔽test部分

all: libbz2.a bzip2 bzip2recover test

#上面这一句去掉test

           保存退出后编译安装:make && make install

         2、yasm的交叉编译     

tar zxvf yasm-1.2.0.tar.gz  -C ./
cd yasm-1.2.0/
./configure --host=arm-linux --prefix=/opt/EmbedSky/freescale/E9/document/OpenCv/__install --enable-shared --enable-static
make
make install

3、ffmpeg编绎请参考上一篇文章

交叉编绎opencv之ffmpeg编绎

4、opencv配置和编译

          4.1 安装cmake-gui

sudo apt-get install cmake-gui

4.2 创建一个目录,用来保存cmake-gui配置完成后的源码

mkdir /opt/EmbedSky/freescale/E9/document/OpenCv/opencv-build

4.3 进入opencv源码目录,运行cmake-gui,打开配置界面如下:



4.4 选择opencv源码路径和新建的/opt/EmbedSky/freescale/E9/document/OpenCv/opencv-build目录。
点击“Configure”,进入配置界面:


4.5 选择“Specify options for cross-compiling”,点击“Next”:

选择交叉编绎器的相关路径


点击“Finish”完成配置。

4.7 配置编绎选项

去除"WITH_CUDA"和"WITH_TIFF",选项,勾选"WITH_V4L","BUILD_JPEG","BUILD_PNG","BUILD_ZLIB"选项。


选择bzip2库的路径,和opencv安装的路径:



此步骤可能会出现无法选择BZIP2_LIBRARIES路径的情况,解决方法:
先取消掉“BUILD_ZLIB”选择,然后点击“Configure”,这样就会出现BZIP2_LIBRARIES,选择路径后再勾选上“BUILD_ZLIB”。

最关键的步骤:
添加ffmpeg的支持(重要,容易出错):将ffmpeg的库和头文件全部放到交叉编译器的对应的目录中去(是复制,不是剪切),将ffmpeg生成后的lib/pkconfig目录中的*.PC文件复制到/usr/lib/pkconfig目录中。
将生成的库文件拷贝到/opt/EmbedSky/toolchains/gcc-4.6.2/tq-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/lib目录
将生成的头文件拷贝到/opt/EmbedSky/toolchains/gcc-4.6.2/tq-linaro-toolchain/arm-fsl-linux-gnueabi/include目录
以上操作的目的是让cmake可以识别到我们编绎成功的库和头文件。

点击“Configure”,进行配置。此时可看到配置信息:

如上信息可看到ffmpeg库的相关信息,如果FFMPEG选项中为NO,或对应的库的版本与交叉编译后的ffmpeg库的版本不一样,则表示opencv没关联上ffmpeg,需重新检查一下ffmpeg的支持,重新点击“Configure”。

查看对V4L的支持(如果没支持,则不能打开USB摄像头),如下:


说明V4L已经支持上,若为下图所示:


则表示还没支持上V4L,拷贝android源码目录下的TQIMX6_android-4.2.2/bionic/libc/kernel/common/linux/videodev.h到交叉编绎器的
/opt/EmbedSky/toolchains/gcc-4.6.2/tq-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/usr/include/linux/目录下。
再次执行Configure。

确定配置没问题,则可点击“Generate”,将编译规则导入/opt/EmbedSky/freescale/E9/document/OpenCv/opencv-build目录。
进入/opt/EmbedSky/freescale/E9/document/OpenCv/opencv-build目录,
make -j4
make install

5、常见问题

常见错误(低版本的交叉编译器可能出现):
错误1:
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcpy'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemset'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFwarningHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcmp'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFfree'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmalloc'
../../lib/libopencv_highgui.so: undefined reference to `TIFFOpen'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_perf_core] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_perf_core.dir/all] 错误 2
make: *** [all] 错误 2
解决方法:修改CMakeCache.txt,WITH_TIFF:BOOL=ON,改成OFF,重新编译,错误消除。

遇到错误2:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'
../../lib/libopencv_core.so: undefined reference to `pthread_key_create
解决方法:
修改CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt,重新编译,错误消除
以上2个错误可能会同时出现,改完再次执行make

//64位下用4.4.6交叉编译器如果出现类似错误:
../../3rdparty/lib/libzlib.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
make[2]: *** [lib/libopencv_core.so] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] 错误 2
make: *** [all] 错误 2
解决方法:
进入opencv目录下的3rdparty的对应目录CMakeFiles/ *.dir下,打开flags.make,在C_FLAGS = 后添加-O3 -fPIC用来支持在64位机上编译
如../3rdparty/zlib/CMakeFiles/zlib.dir/flags.make
修改C_FLAGS =  -W -Wall 为 C_FLAGS =  -O3 -fPIC  -W -Wall

修改CXX_FLAGS =  -W -Wall 为 C_FLAGS =  -O3 -fPIC  -W -Wall



下一篇介绍如何使用OpenCv,控制USB摄像头进行预览,拍照和录像,敬请期待!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值