【Linux】opencv交叉编译移植到linux-arm开发板,并做测试

1.下载源码
使用opencv3.4.1,官网下载。下载后解压获得opencv-3.4.1文件夹,进入后新建一个文件夹并进入,用于后续的交叉编译。

mkdir arm-build
cd arm-build

2.安装环境
安装cmake以及图形界面配置的cmake-gui

sudo apt-get install cmake

sudo apt-get install cmake-gui

3.cmake-gui配置
终端输入cmake-gui进行图形界面的cmake配置,比起输指令更容易配置。

cmake-gui

在where is the source code处选择opencv-3.4.1,在where to build the binaries选择刚刚创建了arm-build文件夹,然后点击左下角的configure。
在这里插入图片描述
点击configure后,在弹出的界面按下图选择,即选择交叉编译配置。然后点击next。
在这里插入图片描述
点击next后进行交叉编译配置,Target System栏里的东西随便填写,主要是红色箭头处,选择你的交叉编译链的gcc和g++,并在Target root处填写你的较差编译工具链的安装位置。之后点击finish。
在这里插入图片描述
点击finishi后软件会配置一段时间,右下角会有进度条。配置完成后在search栏中输入flags,并在勾选advanced,然后按下图进行配置。即将CMAKE_CXX_FLAGS和CMAKE_C_FLAGS的值设为-O3 -fPIC -W -Wall,将CAMKE_EXE_LINKER_FLAGS的值设为-lpthread -lrt -ldl。其实就是配置了编译、链接选项,需要进一步了解其含义可以百度gcc g++ 后的-参数的含义。
在这里插入图片描述
然后在search框搜索zlib,在BUILD_ZLIB后打勾,并选择ZLIB_INCLUDE_DIR路径,为你的opencv源码路径中的3rdparty/zlib.
在这里插入图片描述
配置完成后再次点击configure,完成后点击generate。之后在arm-build文件夹内就获得了根据以上步骤配置好的待编译的交叉编译源码。
4.编译安装
在arm-build目录下进行make

sudo make -j2

如果你严格按照步骤3进行了cmake的配置,那么在make过程中已经不会出现重要错误了,即使出现错误,也是可以根据错误提示进行百度解决的,一般是需要apt-get install某些库。
唯一一个可能还要手动修改的错误就是

opencv-3.4.1/3rdparty/protobuf/src/google/protobuf/stubs/common.cc:52:2: error: #error "No suitable threading library available."

用vi打开common.cc这个文件,可以看到报错原因是缺少了HAVE_PTHREAD这个宏,其实是多线程宏,本来就该有的。那么在前边进行#define HAVE_PTHREAD 就能解决问题

#define HAVE_PTHREAD 
 
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN  // We only need minimal includes
#include <windows.h>
#define snprintf _snprintf    // see comment in strutil.cc
#elif defined(HAVE_PTHREAD)
#include <pthread.h>
#else
#error "No suitable threading library available."
#endif
#if defined(__ANDROID__)
#include <android/log.h>
#endif

按照以上步骤,make顺利通过。
在这里插入图片描述
然后进行安装

sudo make install

安装过程比较快,而且不会有坑,完成后可以在/usr/local/lib中看到opencv的动态链接库,在/usr/local/include中看到opencv的头文件。
5.移植测试
我们在opencv-3.4.1/sample/cpp/example_cmake目录下的example.cpp文件基础上修改测试用例。测试是读取一张jpg图片,并在指定位置置入文本并保存。

#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
#include <iostream>

using namespace cv;
using namespace std;

void drawText(Mat & image);

int main()
{
    cout << "Built with OpenCV " << CV_VERSION << endl;
    Mat image;
    image = imread("test.jpg");
    drawText(image);
    imwrite("test.jpg",image);
    return 0;
}

void drawText(Mat & image)
{
    putText(image, "Hello OpenCV",
            Point(20, 50),
            FONT_HERSHEY_COMPLEX, 1, // font face and scale
            Scalar(255, 255, 255), // white
            1, LINE_AA); // line thickness and type
}

然后用以下命令编译,最前面是交叉编译工具,之后是源文件,之后是链接生成exam可执行文件,然后是-I后接opencv的头文件库,-L后接opencv的动态链接库,之后的一串-l就是/usr/local/lib目录下的安装的所有的opencv的动态库,再最后就是-ldl -lm -lpthread -lrt这几个链接选项。

arm-himix200-linux-g++ example.cpp -o exam -I/usr/local/include -L/usr/local/lib -lopencv_stitching -lopencv_videostab -lopencv_objdetect -lopencv_photo -lopencv_dnn -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_highgui -lopencv_ml -lopencv_superres -lopencv_videoio -lopencv_imgcodecs -lopencv_shape -lopencv_video -lopencv_imgproc -lopencv_core -ldl -lm -lpthread -lrt

编译完成后生成了exam文件,移植到开发板上,并在开发板的exam的同目录下放一个test.jpg,如下图。
在这里插入图片描述

现在执行exam肯定是不行的,因为要获得运行权限

chmod 777 exam

现在./exam运行一下还是不行的,因为exam链接时使用了很多动态库,即/usr/local/lib下所有与opencv相关的动态链接库,一运行会报错,说找不到xxxx.so文件。我们只需要将/usr/local/lib下的so文件打包,打包成tar.gz文件,然后发送到开发板的/lib目录下,tar zxvf解压。
然后再运行,成功了。
在这里插入图片描述
将处理后的test.jpg发送到电脑,可以看到成功在图片上置入了hello opencv文字。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/spiremoon/article/details/105923235