编译基于armV8架构的opencv,并在rock3a开发板上运行
近期在基于arm开发板做图像识别任务开发时,需要用到Opencv库
之前在做rknpu开发时,开发sdk里面已经集成了opencv 但是该opencv开发包不能实现imshow/VideoCapture等函数,经过调研,决定对opencv源代码进行编译,生成armv8架构可以使用的开发包
第一部 下载opencv:
opencv的下载路径为 https://opencv.org/releases/
这里下载3.x版本的 至于为什么用这个版本,我不得而知,因为之前用的就是3.x版本。目标我也不知道4.x版本和3.x版本之间的区别是什么。
第二步 就是下载armv8平台上的gcc和g++编译器
这里的aarch64 对应的就是avmv8的64位版本
第三步 进入opencv源代码路径下,编译安装opencv源码
键入命令 mkdir mybuild 新建一个文件夹 用来保存编译的文件
键入命令 mkdir cv_sdk 用来保存编译后生成的库文件 头文件等文件
第四步 安装cmake cmake-gui等c++编译环境 这里我已经安装完成 故不进行截图了
第五步 采用cmake-gui 搭建编译选项
点击next
这里需要选择第一个选项 也就是aarch64开头的cmake 文件,然后点击finish
设置这两个值 分辨是cmake_build_type 和 cmake_install_prefix
选中with_gtk_2_x 去掉选中with_gtk
再次点击Configure 和 Generate 关闭cmake-gui
第六步 键入命令sudo make -j4 && make install
等待编译安装完成
完成后就会得到 如下图所示的文件夹 bin是可执行文件夹 include是头文件夹 lib是库文件夹 share是cmake文件夹
到此为止 arm版的opencv已经编译完成
接下来 我们采用cmake 和 已经编译好的 Opencv 写一个简单的图像处理程序
这个程序有一个亮点 : 一个是将编译好的动态库文件和头文件 直接拷贝到当前文件目录下,这样的话就方便产品灵活部署,即在其他设备上 不用安装编译Opencv
下图为整个程序的架构
接下来看看CMakeLists.txt文件内容
cmake_minimum_required(VERSION 3.1)
project(opencv)
include_directories(/home/rock/opencv_test1/cv_sdk/include)
link_directories(/home/rock/opencv_test1/cv_sdk/lib)
add_executable(opencv opencv.cpp)
target_link_libraries(opencv /home/rock/opencv_test1/cv_sdk/lib/libopencv_highgui.so.3.4.5 /home/rock/opencv_test1/cv_sdk/lib/libopencv_imgcodecs.so.3.4.5 /home/rock/opencv_test1/cv_sdk/lib/libopencv_imgproc.so.3.4.5
/home/rock/opencv_test1/cv_sdk/lib/libopencv_video.so.3.4.5
/home/rock/opencv_test1/cv_sdk/lib/libopencv_core.so.3.4.5
/home/rock/opencv_test1/cv_sdk/lib/libopencv_videoio.so.3.4.5
)
接下来看看源文件
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
int main()
{
cv::VideoCapture cap;
cv::Mat srcImage = cv::imread("1.jpg");
cv::Mat img;
cv::cvtColor(srcImage, img, cv::COLOR_BGR2RGB);
//cv::imwrite("resize_input.jpg", srcImage);
cv::imwrite("resize_input.jpg", img);
//cv::Mat img;
cv::cvtColor(srcImage, img, cv::COLOR_BGR2RGB);
cv::imshow("源图像",srcImage);
cv::waitKey(0);
return 0;
}
在build文件夹下进行编译
,得到可执行文件
说明opencv的编译是成功的