myzr_soft 发表于 2020-1-13 08:39:48

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.gzLast_x264 :ftp://ftp.videolan.org/pub/x264/snapshots/last_x264.tar.bz2Xvidcore : https://downloads.xvid.com/downloads/xvidcore-1.3.5.tar.gzLibpng:https :https://nchc.dl.sourceforge.net/ ... ibpng-1.6.37.tar.gzJpeg : http://www.ijg.org/files/jpegsrc.v9c.tar.gzYasm : http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gzFfmpeg : http://ffmpeg.org/releases/ffmpeg-3.4.6.tar.bz2Opencv3.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/bin:$PATH创建工作目录并解压:$ 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


在search下搜索WITH_TIFF去掉勾选,搜索CMAKE_BUILD_TYPE,把值改为Release,搜索CMAKE_INSTALL_PREFIX,把值改为install的路径





点击Generate生成Makefile关闭cmake$ vi CMakeCache.txt找到 CMAKE_EXE_LINKER_FLAGS 一行 在后面加上-lpthread -lrt -ldl开始编译$ make 错误:../../3rdparty/lib/libzlib.a: error adding symbols: 错误的值$ vi ../3rdparty/zlib/CMakeLists.txt 将:改为:错误:../../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盘复制到电脑查看
图片一:


图片二:


图片三:







lzqc 发表于 2020-1-16 14:20:22

为什么没有使用默认安装的工具链中的arm-poky-linux-gnueabi-gcc编译器?

myzr_soft 发表于 2020-1-16 14:41:22

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:53

请问要想使能开发板的openCV显示功能该如何实现

mumu_A 发表于 2020-9-11 16:18:28

ggg 发表于 2020-9-11 10:30
请问要想使能开发板的openCV显示功能该如何实现

你可以加上那gtk或者qt的库试试,或者也可以在网上找一下显示图片之类的例程,把opencv生成的数据在屏幕上显示,而不是通过opencv提供的接口来显示。
页: [1]
查看完整版本: opencv交叉编译