OpenCV(2) — CK860交叉编译

  • Post author:
  • Post category:其他


在上一篇

OpenCV(1) — Ubuntu编译安装

中我记录了Ubuntu上编译OpenCV的过程,今天再记录下将OpenCV编译到CK860平台上的过程。在文章

Qemu(1) — Ubuntu下运行CK860 Qemu

中我记录了在Ubuntu环境下搭建CK860 Qemu环境的过程,有需要可以参考。



1. 源码



OpenCV(1) — Ubuntu编译安装

中已经介绍过源码的获取方式,此处直接将当时下载的源码拷贝过来使用。在源码下面建立一个空的

build

目录用于编译。

opencv源码目录



2. 配置编译参数

  1. 先安装一个

    cmake-gui

    的程序,它能够将cmake的参数可视化,挺好用的。
sudo apt install cmake-gui
  1. 运行

    cmake-gui

    程序,填写源码路径和编译输出路径。

    源码和编译输出路径
  2. 点击

    Configure

    ,第一次会让我们选择cmake生成的工程文件类型,以及编译使用的工具链。依次选择

    Unix Makefiles



    Specify options for cross-compiling

    ,点击

    Next



    cmake工程类型
  3. 我下载的qemu linux版本是

    5.10.4

    ,qemu启动参数是

    -smp 4

    ,依此填写

    1


    2


    3

    。因为是交叉编译,我们需要设置交叉编译工具的路径,我已经将csky工具链的路径加入了环境变量,故此处

    4


    5

    只填写了程序名称。

    6

    需要填写交叉工具链中库以及头文件的搜索路径,这里填写

    /opt/csky-v3.10.29

    也可以,暂不清楚有啥区别。点击

    Finish

    完成配置,cmake-gui会开始执行第一次的配置,时间1分钟左右,会在

    build

    目录下生成一些文件,之后再次配置就比较快了。

    工具链信息配置
  4. 第一次配置完成,可以看到有许多可选项,我们可以进行修改。

    在这里插入图片描述



3. 裁减OpenCV

  1. 在cmake-gui的

    Search

    栏里我们可以搜索我们想要修改的项,先作以下修改。修改之后重新

    Configure



    Cenerate

描述
OPENCV_GENERATE_PKGCONFIG 生成pkgconfig/opencv4.pc文件,编译时有用
BUILD_opencv_python_bindings_generator 暂时不用python
BUILD_opencv_python_tests 暂时不用python
PYTHON3_EXECUTABLE 没有python
PYTHON3_PACKAGES_PATH 没有python
CMAKE_INSTALL_PREFIX /home/xflm/workspace/csky/qemu/share/opencv,自定义安装路径
BUILD_opencv_java_bindings_generator 暂时不用java
BUILD_opencv_js_bindings_generator 暂时不用js
BUILD_opencv_objc_bindings_generator 暂时不用objc
BUILD_opencv_world 设置为是的话会将所有的动态库合并成一个动态库文件,暂不需要
WITH_GTK 暂时不支持Gtk
OPENCV_EXTRA_MODULES_PATH /home/xflm/workspace/csky/opencv/opencv_contrib-master/modules,设置第三方模组的路径,注意一定要选到module文件夹
  1. 重新

    Configure



    Cenerate

    之后,还需要修改一下

    build/CmakeCache.txt

    文件,给

    CMAKE_C_FLAGS



    CMAKE_CXX_FLAGS



    CMAKE_EXE_LINKER_FLAGS

    追加一些值。修改完毕后,需要在cmake-gui中点击

    File



    Reload Cache



    Configure



    Cenerate

    。若没有

    Reload Cache



    build/CmakeCache.txt

    中的修改可能会被覆盖。

CMAKE_C_FLAGS:STRING=-mcpu=ck860fv

CMAKE_CXX_FLAGS:STRING=-mcpu=ck860fv

CMAKE_EXE_LINKER_FLAGS:STRING=-ldl -lm -lpthread -lrt -mcpu=ck860fv



4. 编译安装

我在Ubuntu虚拟机上编译,大概编了半小时。

$ cd build; make -j8
$ make install

编译时间



5. 测试程序

  1. OpenCV中有一个二维码识别的库,我们调用一下。

main.c

#include <iostream>
#include <opencv2/opencv.hpp>

int main(void)
{
	cv::Mat img = cv::imread("QR.png", -1);
	cv::QRCodeDetector qrDetector;
	std::vector<cv::Point> points;
	cv::Mat rectified;
	std::string data;
	data = qrDetector.detectAndDecode(img, points, rectified);
	std::cout << data << std::endl;
}

在Ubuntu上交叉编译

csky-abiv2-linux-g++ main.c -mcpu=ck860fv `pkg-config /home/xflm/workspace/csky/qemu/share/opencv/lib/pkgconfig/opencv4.pc --libs --cflags` -o qr_test
  1. 通过共享文件的方式拷贝到qemu linux中运行,可以看到这里运行比较慢但是可以运行。

    运行示例



6. 问题回顾

  1. 之前编译的过程中出现

    csky-v3.10.29/csky-linux-gnyabiv2/libc/usr/include/features.h:363:

    语法错误,最终在363行增加

    #define _FILE_OFFSET_BITS 64

    来解决问题。这里是定义的值和一个文件允许的最大长度有关,这次重新编译时我将上述添加的语句去掉了并没有再出现上述问题,暂不深究了。
  2. 最开始编译的opencv库拷贝到qemu中运行时,会提示

    Trace/breakpoint trap

    错误,后来猜测可能是

    csky-abiv2-linux-gcc

    默认编译的cpu不是ck860,考虑在编译参数上增加

    -mcpu=ck860

    ,即解决问题。后使用的实际板卡芯片是

    ck860fv

    型号,故这里设置为

    -mcpu=ck860fv

    ,测试也可以在

    qemu-system-abiv2 -cpu ck860v

    上运行。

    Trace/breakpoint trap



7. 参考


Opencv移植到ARM



移植Opencv3.2到IMX6上



CMake Error at cmake/OpenCVModule.cmake:288 (message): No modules has been found:



opencv库 交叉编译features.h:272:52: error: operator ‘&&‘ has no right operand



opencv移植arm共享库中嵌套库带路径-已解决



版权声明:本文为qq_37858281原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。