欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-31 10:44:28
...

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。
opencv交叉编译移植到linux-arm开发板,并做测试
点击configure后,在弹出的界面按下图选择,即选择交叉编译配置。然后点击next。
opencv交叉编译移植到linux-arm开发板,并做测试
点击next后进行交叉编译配置,Target System栏里的东西随便填写,主要是红色箭头处,选择你的交叉编译链的gcc和g++,并在Target root处填写你的较差编译工具链的安装位置。之后点击finish。
opencv交叉编译移植到linux-arm开发板,并做测试
点击finishi后软件会配置一段时间,右下角会有进度条。配置完成后在search栏中输入flags,并在勾选advanced,然后按下图进行配置。即将CMAKE_CXX_FLAGS和CMAKE_C_FLAGS的值设为-O3 -fPIC -W -Wall,将CAMKE_EXE_LINKER_FLAGS的值设为-lpthread -lrt -ldl。其实就是配置了编译、链接选项,需要进一步了解其含义可以百度gcc g++ 后的-参数的含义。
opencv交叉编译移植到linux-arm开发板,并做测试
然后在search框搜索zlib,在BUILD_ZLIB后打勾,并选择ZLIB_INCLUDE_DIR路径,为你的opencv源码路径中的3rdparty/zlib.
opencv交叉编译移植到linux-arm开发板,并做测试
配置完成后再次点击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顺利通过。
opencv交叉编译移植到linux-arm开发板,并做测试
然后进行安装

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,如下图。
opencv交叉编译移植到linux-arm开发板,并做测试

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

chmod 777 exam

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

相关标签: 嵌入式 Linux Arm