OpenCV(2) --- CK860交叉编译

在上一篇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 MakefilesSpecify options for cross-compiling,点击Next
    OpenCV(2) --- CK860交叉编译_第1张图片
  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目录下生成一些文件,之后再次配置就比较快了。
    OpenCV(2) --- CK860交叉编译_第2张图片
  4. 第一次配置完成,可以看到有许多可选项,我们可以进行修改。
    OpenCV(2) --- CK860交叉编译_第3张图片

3. 裁减OpenCV

  1. 在cmake-gui的Search栏里我们可以搜索我们想要修改的项,先作以下修改。修改之后重新ConfigureCenerate
描述
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. 重新ConfigureCenerate之后,还需要修改一下build/CmakeCache.txt文件,给CMAKE_C_FLAGSCMAKE_CXX_FLAGSCMAKE_EXE_LINKER_FLAGS追加一些值。修改完毕后,需要在cmake-gui中点击FileReload CacheConfigureCenerate。若没有Reload Cachebuild/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 
#include 

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中运行,可以看到这里运行比较慢但是可以运行。
    OpenCV(2) --- CK860交叉编译_第4张图片

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共享库中嵌套库带路径-已解决

你可能感兴趣的:(C,linux,编译器)