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