明远智睿技术论坛

标题: opencv交叉编译 [打印本页]

作者: myzr_soft    时间: 2020-1-13 08:39
标题: opencv交叉编译
本帖最后由 myzr_soft 于 2020-1-16 16:44 编辑

主机平台: UBUNTU14.04
硬件平台:明远智睿MY-IMX6-EK200-6Q-1G
内核版本 :linux-4.1.15
交叉编译链:arm-linux-gnueabihf


下载:
Zlib:http://www.zlib.net/zlib-1.2.11.tar.gz
Last_x264 :ftp://ftp.videolan.org/pub/x264/snapshots/last_x264.tar.bz2
Xvidcore : https://downloads.xvid.com/downloads/xvidcore-1.3.5.tar.gz
Libpng:https :https://nchc.dl.sourceforge.net/ ... ibpng-1.6.37.tar.gz
Jpeg : http://www.ijg.org/files/jpegsrc.v9c.tar.gz
Yasm : http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
Ffmpeg : http://ffmpeg.org/releases/ffmpeg-3.4.6.tar.bz2
Opencv3.2 : https://codeload.github.com/opencv/opencv/tar.gz/3.2.0
安装cmake3:
$ sudo apt-get install cmake3-qt-gui

配置交叉工具链:
$ export PATH=/home/myzr/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/binPATH
创建工作目录并解压:
$ mkdir opencv
将源码包复制到opencv目录
$ cd opencv
$ mkdir install
$ tar xzvf zlib-1.2.11.tar.gz
$ tar xzvf libpng-1.6.37.tar.gz
$ tar xzvf jpegsrc.v9c.tar.gz
$ tar xzvf yasm-1.3.0.tar.gz
$ tar xzvf xvidcore-1.3.5.tar.gz
$ tar xf ffmpeg-3.4.6.tar.bz2

$ cd zlib-1.2.11/
$ RANLIB=AR=arm-linux-gnueabihf-ranlib AR=arm-linux-gnueabihf-ar CC=arm-linux-gnueabihf-gcc ./configure --prefix=/home/myzr/opencv/install/ --shared
$ make
$ make install

$ cd ../jpeg-9c/
$ ./configure --host=arm-linux-gnueabihf --prefix=/home/myzr/opencv/install/  --enable-shared --enable-static
$ make
$ make install

$ cd ../libpng-1.6.37/
$ CC=arm-linux-gnueabihf-gcc ./configure --prefix=/home/myzr/opencv/install/ --host=arm-linux LIBS=-L/home/myzr/opencv/install/lib CPPFLAGS=-I/home/myzr/opencv/install/include
$ make
$ make install

$ cd ../yasm-1.3.0/
$ ./configure --host=arm-linux-gnueabihf --prefix=/home/myzr/opencv/install/ --enable-shared
$ make
$ make install

$ cd ../x264-snapshot-20190822-2245/
$ CC="arm-linux-gnueabihf-gcc -fPIC" ./configure --enable-shared --host=arm-linux-gnueabihf --disable-asm --prefix=/home/myzr/opencv/install/
$ make
$ make install

$ cd ../xvidcore/build/generic/
$ CC=arm-linux-gnueabihf-gcc ./configure --prefix=/home/myzr/opencv/install/ --host=arm-linux-gnueabihf --disable-assembly
$ make
$ make install

$ cd ../../../ffmpeg-3.4.6/
$ ./configure --prefix=/home/myzr/opencv/install/ --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-linux-gnueabihf-gcc --enable-swscale --extra-ldflags=-L/home/myzr/opencv/install/lib --extra-cflags=-I/home/myzr/opencv/install/include
$ make
$ make install

$ cd ../opencv-3.2.0/
$ mkdir build
$ mkdir install
$ cd build/
$ cmake-gui
[attach]642[/attach]
[attach]643[/attach]

在search下搜索WITH_TIFF去掉勾选,搜索CMAKE_BUILD_TYPE,把值改为Release,搜索CMAKE_INSTALL_PREFIX,把值改为install的路径
[attach]644[/attach][attach]645[/attach]


[attach]646[/attach]


点击Generate生成Makefile
关闭cmake
$ vi CMakeCache.txt
找到 CMAKE_EXE_LINKER_FLAGS 一行 在后面加上-lpthread -lrt -ldl
[attach]649[/attach]
开始编译
$ make
错误:../../3rdparty/lib/libzlib.a: error adding symbols: 错误的值
$ vi ../3rdparty/zlib/CMakeLists.txt
将:[attach]647[/attach]
改为:[attach]648[/attach]
错误:../../3rdparty/lib/liblibjpeg.a: error adding symbols: 错误的值
$ vi ../3rdparty/libjpeg/CMakeLists.txt
与上同理

错误:../../3rdparty/lib/liblibwebp.a: error adding symbols: 错误的值
$ vi ../3rdparty/libwebp/CMakeLists.txt
与上同理

错误:../../3rdparty/lib/liblibpng.a: error adding symbols: 错误的值
$ vi ../3rdparty/libpng/CMakeLists.txt
与上同理

错误:../../3rdparty/lib/liblibjasper.a: error adding symbols: 错误的值
$ vi ../3rdparty/libjasper/CMakeLists.txt
与上同理
错误:../../3rdparty/lib/libIlmImf.a: error adding symbols: 错误的值
$ vi ../3rdparty/openexr/CMakeLists.txt
与上同理

$ make install

/home/myzr/opencv/opencv-3.2.0/install/ 目录下的即为编译得到的文件
将lib中的库移植到开发板的/lib目录

注意:默认是选择的显示方式为gtk,但是由于开发板默认没有gtk的库,所以要显示的话,会输出需要 libgtk2.0-dev and pkg-config
而若是在cmake时,选择with_qt,并且将Ungrouped Entries中QT的库设置为相应的qmake所在路径后 将选择QT作为显示,但是在开发板上运行时提示需要插件'xcb',但是开发板中的QT是没有xcb.


最终,在网上的opencv移植的帖子中找到了没有使用到显示的例程,原帖链接为:https://blog.csdn.net/houge101/article/details/79433503


例程:
#include<opencv2/core/core.hpp>                                                                                                                                       
#include<opencv2/highgui/highgui.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main( )
{
        //载入图片  
        Mat image= imread("girl.jpg");
        Mat logo= imread("fly.jpg");
        //定义一个Mat类型,用于存放,图像的ROI  
        Mat imageROI;

        imageROI= image(Rect(10,10,logo.cols,logo.rows));//定义一个左上角点坐标为(_x, _y)的cols*rows矩形窗口

        //将logo加到原图
        //参数:图、权重、图、权重、添加的常数项、输出图
        addWeighted(imageROI,0.5,logo,0.3,0.,imageROI);

        cout << "start add picture......\n" << endl;
        //输出一张jpg图片到工程目录下  
        imwrite("fly_girl.jpg",image);

        waitKey();

        return 0;
}


例程编译:
指定 PKG_CONFIG_PATH 为opencv.pc 所在路径
$ export PKG_CONFIG_PATH=/home/myzr/opencv/opencv-3.2.0/build/unix-install
交叉编译:   
$ arm-linux-gnueabihf-g++ opencv.cpp -o opencv `pkg-config --cflags --libs opencv`

将编译得到的opencv测试程序与两张jpg图片复制到开发板中执行
# ./opencv
将输出的图片通过U盘复制到电脑查看
图片一:
[attach]651[/attach]

图片二:
[attach]650[/attach]

图片三:
[attach]652[/attach]







作者: lzqc    时间: 2020-1-16 14:20
为什么没有使用默认安装的工具链中的arm-poky-linux-gnueabi-gcc编译器?
作者: myzr_soft    时间: 2020-1-16 14:41
lzqc 发表于 2020-1-16 14:20
为什么没有使用默认安装的工具链中的arm-poky-linux-gnueabi-gcc编译器?

使用arm-poky-linux-gnieabi 可以编译依赖的库,但是在使用cmake的时候,指定gcc和g++的时候$CC后面的参数没办法指定 (也可能是需要使用其他的方式去指定) ,为了不那么麻烦,便使用5.3的工具链来编译
作者: ggg    时间: 2020-9-11 10:30
请问要想使能开发板的openCV显示功能该如何实现
作者: mumu_A    时间: 2020-9-11 16:18
ggg 发表于 2020-9-11 10:30
请问要想使能开发板的openCV显示功能该如何实现

你可以加上那gtk或者qt的库试试,或者也可以在网上找一下显示图片之类的例程,把opencv生成的数据在屏幕上显示,而不是通过opencv提供的接口来显示。




欢迎光临 明远智睿技术论坛 (http://bbs.myzr.com.cn/) Powered by Discuz! X3.2