在上一篇
    
     OpenCV(1) — Ubuntu编译安装
    
    中我记录了Ubuntu上编译OpenCV的过程,今天再记录下将OpenCV编译到CK860平台上的过程。在文章
    
     Qemu(1) — Ubuntu下运行CK860 Qemu
    
    中我记录了在Ubuntu环境下搭建CK860 Qemu环境的过程,有需要可以参考。
   
    
    
    1. 源码
   
    在
    
     OpenCV(1) — Ubuntu编译安装
    
    中已经介绍过源码的获取方式,此处直接将当时下载的源码拷贝过来使用。在源码下面建立一个空的
    
     build
    
    目录用于编译。
    
     
   
    
    
    2. 配置编译参数
   
- 
     先安装一个
 
 cmake-gui
 
 的程序,它能够将cmake的参数可视化,挺好用的。
sudo apt install cmake-gui
- 
     运行
 
 cmake-gui
 
 程序,填写源码路径和编译输出路径。
 
   
- 
     点击
 
 Configure
 
 ,第一次会让我们选择cmake生成的工程文件类型,以及编译使用的工具链。依次选择
 
 Unix Makefiles
 
 》
 
 Specify options for cross-compiling
 
 ,点击
 
 Next
 
 。
 
   
- 
     我下载的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
 
 目录下生成一些文件,之后再次配置就比较快了。
 
   
- 
     第一次配置完成,可以看到有许多可选项,我们可以进行修改。
 
   
    
    
    3. 裁减OpenCV
   
- 
     在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文件夹 | 
- 
     重新
 
 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. 测试程序
   
- 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
- 
     通过共享文件的方式拷贝到qemu linux中运行,可以看到这里运行比较慢但是可以运行。
 
   
    
    
    6. 问题回顾
   
- 
     之前编译的过程中出现
 
 csky-v3.10.29/csky-linux-gnyabiv2/libc/usr/include/features.h:363:
 
 语法错误,最终在363行增加
 
 #define _FILE_OFFSET_BITS 64
 
 来解决问题。这里是定义的值和一个文件允许的最大长度有关,这次重新编译时我将上述添加的语句去掉了并没有再出现上述问题,暂不深究了。
- 
     最开始编译的opencv库拷贝到qemu中运行时,会提示
 
 Trace/breakpoint trap
 
 错误,后来猜测可能是
 
 csky-abiv2-linux-gcc
 
 默认编译的cpu不是ck860,考虑在编译参数上增加
 
 -mcpu=ck860
 
 ,即解决问题。后使用的实际板卡芯片是
 
 ck860fv
 
 型号,故这里设置为
 
 -mcpu=ck860fv
 
 ,测试也可以在
 
 qemu-system-abiv2 -cpu ck860v
 
 上运行。
 
   
    
    
    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共享库中嵌套库带路径-已解决
    
   
 
