交叉编绎OpenCv之OpenCv编绎
来源:互联网 发布:设计楼房的软件 编辑:程序博客网 时间:2024/04/30 06:25
上一篇介绍了如何交叉编绎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-staticmakemake install3、ffmpeg编绎请参考上一篇文章
交叉编绎opencv之ffmpeg编绎
4、opencv配置和编译
4.1 安装cmake-gui
sudo apt-get install cmake-gui4.2 创建一个目录,用来保存cmake-gui配置完成后的源码
mkdir /opt/EmbedSky/freescale/E9/document/OpenCv/opencv-build4.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 -j4make 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摄像头进行预览,拍照和录像,敬请期待!
- 交叉编绎OpenCv之OpenCv编绎
- 交叉编绎opencv之ffmpeg编绎
- 交叉编绎OpenCv之预览,拍照和录像
- opencv 学习之 编解码方式读取
- OpenCV之视频文件编解码 ---20170811
- CrossTools交叉编绎工具!
- OpenCV Jpeg编解码
- OpenCV-PNG编解码移植
- 交叉编绎nano-editor for ARM
- [原创]opencv学习之eclipse平台编…
- opencv如何对视频进行编解码
- 交叉编绎环境的建立和内核的编绎。
- 编绎Boost。
- Unity脚本编绎
- 编绎OpenJDK
- Unity3D-脚本编绎
- VS2005编绎SQLITE3
- sqlite3编绎
- navicat for mysql 显示中文乱码解决办法
- android的一些总结——Broadcast
- 面试突击——数据结构基础,排序
- java写的Base64的类
- 开发时需要 hql 转 sql 查看
- 交叉编绎OpenCv之OpenCv编绎
- Oracle SQL:经典查询练手第四篇
- 三十分钟掌握STL
- 创建自己的yum源
- VC学习——在窗口中显示位图
- ffmpeg转码会声会影编辑的视频失败问题解决
- java转码各种方法
- SQL存储过程和视图
- Oracle SQL:经典查询练手第一篇