ubuntu 18.04 LTS交叉编译opencv 3.4.16并编译工程[全记录]

news2024/11/18 23:01:36

一、下载并解压opencv 3.4.16源码

https://opencv.org/releases/
放到home路径下的Exe文件夹(专门放用户安装的软件)中,其中build是后期自建的
为了版本控制,保留了3.4.16,并增加了-gcc-arm
在这里插入图片描述

二、安装cmake和cmake-gui

我用命令安装的,版本不是最新的,但二者的版本是匹配的。

sudo apt install cmake
sudo apt-get install cmake-gui

查看版本
在这里插入图片描述

三、启动cmake-gui并编译opencv 3.4.16

1.启动cmake-gui对话框

sudo cmake-gui

2.在opencv源码路径下新建build文件夹(用于存放编译文件)
3.在/usr/local路径下新建opencv3.4.16-gcc-arm文件夹(用于存放编译结果)
4.对话框设置
参考博文:https://blog.csdn.net/xiaopang_love_study/article/details/121617995#t7
部分设置截图如下:
4.1设置source和build为opencv解压后的路径,之后点击configure
在这里插入图片描述
4.2选择交叉编译器
在这里插入图片描述
4.3设置编译器为gcc-arm,该编译器之前解压到了Exe文件夹中了,并不是命令安装的,但设置了gcc-arm相关的环境变量(百度搜索安装方法即可,编译器的完整名称:gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf)。
(C、C++、Target Root均来自该编译器目录,其他Target Root选择lib文件夹,而不是lib64文件夹)
其他默认。点“Finish”
在这里插入图片描述
在新的对话框中的Search框搜索输入Z和install:
Z:把搜索到的BUILD_ZLIB打勾。
install:把搜索到的安装路径改为/usr/local/opencv3.4.16-gcc-arm
(之前新建了opencv3.4.16-gcc-arm,方便后期移植到arm环境时拷贝lib文件夹)
依次点Configure、Generate。如果红色的行都消失了,说明配置成功。关闭CMake对话框。
在这里插入图片描述

四、编译和安装OpenCV 3.4.16

1.进入opencv源文件夹内的build路径
执行

cd opencv/build    #进入配置好的编译目录
sudo make -j4      #启动4个核一起编译
sudo make install  #拷贝编译结果到/usr/local/opencv3.4.16-gcc-arm目录

若有编译错误,参考原博文https://blog.csdn.net/xiaopang_love_study/article/details/121617995#t7
或其他博文

2.设置环境变量
2.1设置/etc/ld.so.conf.d/opencv.conf

sudo gedit /etc/ld.so.conf.d/opencv.conf

在opencv.conf中添加

/usr/local/opencv3.4.16-gcc-arm/lib

如下图
在这里插入图片描述
加载操作

sudo ldconfig

2.设置/etc/bash.bashrc

sudo gedit /etc/bash.bashrc

添加

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

更新环境变量

source /etc/bash.bashrc
sudo updatedb

-------------------至此,opencv被gcc-arm编译并安装完成。---------------------------

五、交叉编译opencv 3.4.16工程

1.参考博文:https://blog.csdn.net/xiaopang_love_study/article/details/121617995#t7
编写mergeImg.cpp代码和CMakeLists.txt
mergeImg.cpp

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include <iostream>
#include <stdio.h>
 
using namespace cv;
using namespace std;
 
int main(int argc, char **argv)
{
    Mat imsrc1 = imread(argv[1]);
    Mat imsrc2 = imread(argv[2]);
    Mat imsrc2_scaler;      //将imsrc2缩放到imsrc1的尺寸
    Mat imdst;              //合成的目标图像
    double alpha = 0.3;
    double gamma = 0;
    if(imsrc1.size() != imsrc2.size())
    {
        printf("resize start!\n");
        resize(imsrc2, imsrc2_scaler, imsrc1.size(), 0, 0, INTER_LINEAR);
        addWeighted(imsrc1, alpha, imsrc2_scaler, 1 - alpha, gamma, imdst);
    }
    else
    {
        addWeighted(imsrc1, alpha, imsrc2, 1 - alpha, gamma, imdst);
    }
 
    imwrite("imdst.jpg", imdst);
    return 0;
}

CMakeLists.txt

cmake_minimum_required (VERSION 3.5.1)
 
PROJECT (mergeImg)
 
set(OpenCV_DIR /usr/local/opencv3.4.16-gcc-arm/lib)
include_directories(/usr/local/opencv3.4.16-gcc-arm/include)
find_package(OpenCV REQUIRED)
 
add_executable (mergeImg "mergeImg.cpp")
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} -lpthread -ldl)

2.利用cmake-gui编译mergeImg工程,生成makefile等文件
流程与上述编译opencv类似,其中:
(1)code和binaries均为mergeImg工程路径(build是新建的,用于存储编译文件)
(2)CAMKE_FIND_ROOT_PATH默认为gcc-arm的lib文件夹/home/lyc/Exe/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/lib (之前在home文件夹内安装的)
(3)OpenCV_DIR默认为/usr/local/opencv3.4.16-gcc-arm/share/OpenCV(注意:之前我将opencv安装在了home文件夹,但cmake-gui中的OpenCV_DIR默认是/usr/local,尝试了多种方法仍无法修改,configure后仍为/usr/local,最后选择将opencv安装在/usr/local,避免了修改cmake-gui中的OpenCV_DIR)
(4)依次点击configure、generate
在这里插入图片描述
该过程在build文件夹中生成的文件如下(有些可能是make命令生成的,记不清了):
在这里插入图片描述
3.make命令行编译mergeImg工程
在命令窗口中,进入build文件夹,执行:

sudo make -j4

即可得到执行文件mergeImg
在这里插入图片描述
因交叉编译,执行文件只能在arm平台上运行,需要查看可执行文件是否符合arm框架
参考博文:https://blog.csdn.net/qq_44681788/article/details/130901649

file mergeImg

在这里插入图片描述
或者

readelf -h mergeImg

在这里插入图片描述
可以看出,执行文件符合ARM架构。

至此,交叉编译完毕。

六、移植编译结果
将执行文件mergeImg,两张图像angle.jpg和plane.jpg放到opencv_test_V2文件夹中,与opencv编译结果opencv3.4.16-gcc-arm文件夹(在上述/usr/local/中)一起移植:
(1)opencv_test_V2放到arm环境的用户目录下
在这里插入图片描述
(2)opencv3.4.16-gcc-arm文件夹放到arm环境/usr/local/下
在这里插入图片描述
在arm环境中,进入opencv_test_V2,执行命令:

./mergeImg plane.jpg angle.jpg

执行文件将两张图像angle.jpg和plane.jpg进行了融合,得到运行结果imdst.jpg
在这里插入图片描述至此,移植完毕!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1099439.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs基于vue网上考勤系统

本网上考勤系统是针对目前考勤的实际需求&#xff0c; 采用计算机系统来管理信息&#xff0c;取代人工管理模式&#xff0c;查询便利&#xff0c;信息准确率高&#xff0c;节省了开支&#xff0c;提高了工作的效率。 本网上考勤系统主要包括个人中心、员工请假管理、员工考勤管…

哈希表简介

基本介绍 思路分析 代码实现 # 哈希表 # 员工信息 class Emp:id: int 0name: str next Nonedef __init__(self, id, name):self.id idself.name namedef __str__(self):return f"id{self.id}, name{self.name}"class EmpLinkedList:# 头指针&#xff0c;指向第…

jenkins整合gerrit

背景 公司项目之前使用jenkins整合了gitlab&#xff0c;后面代码迁移到gerrit&#xff0c;所以需要修改jenkins配置。下面就简单的介绍一下jenkins如何整合gerrit。 环境 服务器&#xff1a;linux 环境&#xff1a;docker、jenkins 代码仓库&#xff1a;gerrit 前提 docke…

Flink的ResourceManager详解(一)

ResourceManager 总结 一、概述 1、ResourceManager 管理 Flink 集群中的计算资源&#xff0c;计算资源主要来自 TaskManager 组件。 2、如果集群采用 Native【本地模式】部署&#xff0c;则 ResourceManager 会动态地向集群资源管理器申请 Container 并启动TaskManager&…

depcheck检查项目依赖的安装情况-帮你解决各种项目运行灵异事件

depcheck检查项目缺失的依赖 depcheck介绍与安装介绍安装 depcheck使用基础使用注意 进阶使用 删除多余的依赖注意 depcheck介绍与安装 介绍 工作中&#xff0c;以下的场景恐怕大家都有经历过&#xff1a; 从代码仓库上面 clone 的项目&#xff0c;自己本地一运行就报错… 用…

Ruby和面向对象技术

Ruby和许多极为流行的编程语言都是面向对象的。多数的面向对象编程语言&#xff0c;每个对象都是一个样例或者既定类的实例以及独立对象的行为。 一、创建一个通用对象 创建一个通用对象 obj Object.new定义通用对象的行为 def obj.talk puts "I am an object"p…

MySQL远程连接

一、什么是mysq的远程连接? 1、本地连接 直接在本地使用mysqladmin命令登录 mysql -u root -p 解释如下: mysql:mysql 命令表示要启动 MySQL 客户端。-u root:-u 选项指定要使用的用户名。在这里,我们使用 root 用户名作为示例。-p:-p 选项需要用户输入密码。如果省…

Unexpected mutation of “dialogVisible“ prop.

问题记录&#xff1a; Vue2项目在封装element-ui的dialog组件时&#xff0c;eslint报错 Unexpected mutation of “dialogVisible” prop.eslintvue/no-mutating-props 大致意思是父组件传递过来的 dialogVisible 属性&#xff0c;不允许在子组件中修改父组件的值 解决方法&a…

qtabwidget 样式表

.QWidget{background-color: #ffffff; }/*设置TabWidget中QTabBar的样式*/ QTabWidget{background-color: #E6EBE8; } QTabBar::tab{background-color: #DEDEDE;font-family:Source Han Sans CN; /*设置tab中的文本的字体*/font-size:20pt;font-weight: normal;color:#3D3D3…

HCIP---BGP社团属性

文章目录 目录 文章目录 前言 一.BGP社团属性概述 公有社团属性 配置命令 前言 前文详细介绍了BGP的基础内容&#xff0c;本编将着重于BGP协议的另一个重点内容进行详解。 一.BGP社团属性概述 BGP社区属性是BGP路由协议中的一种特殊属性&#xff0c;可以用于指定一组AS号码&…

线程安全案例 --- 线程池

小王学习录 今日鸡汤什么是线程池为什么需要线程池1. 协程2. 线程池3. 什么是用户态和内核态使用线程池 --- java标准库1. 线程池的创建2. 工厂模式3. 线程池的使用ThreadPollExecutor类构造方法1. corePoolSize, maximumPoolSize 线程2. long keepAliveTime, TimeUnit unit 时…

paddlenlp:社交网络中多模态虚假媒体内容核查(特征篇)

初赛之特征构造 写在前面一、安装paddleOCR二、代码部分三、模型优缺点四、写在最后 写在前面 通过前面两篇文章的介绍&#xff0c;我们可以大致的知道模型用到的特征分为四块&#xff1a;qCap&#xff0c;qImg&#xff0c;captions&#xff0c;imgs。根据这些特征&#xff0c…

第一章 C语言程序设计Pro

考点一 C语言特点&#xff0c;C程序基本构成 数据类型丰富运算符丰富是一种中级语言&#xff08;高级&#xff09; //包含了中级和高级的特性数据类型检查不严格 //int和char通用 对下标的越界不报错 2021.下列属于计算机中高级语言的是&#xff08;…

嵌入式基础——哈弗结构

文章目录 1 什么是哈弗结构&#xff1f;2 哈弗结构单片机的特点3 什么是改进的(Enhanced)哈弗结构?4 写在最后 1 什么是哈弗结构&#xff1f; 哈佛结构是一种将程序指令存储和数据存储分开的存储器结构&#xff0c;如图所示&#xff1a; 哈佛结构是一种并行体系结构&#xf…

Consider using the `--user` option or check the permissions.

ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问。: C:\\Users\\luckyli\\anaconda3\\envs\\CV\\Lib\\site-packages\\~orch\\lib\\asmjit.dll Consider using the --user option or check the permissions. 安装pytorch时遇到上述问题 通过以下…

Git Cherry Pick的使用

cherry-pick命令的基本用法 cherry-pick命令的基本语法如下&#xff1a; git cherry-pick <commit>其中&#xff0c;<commit>是要应用的提交的哈希值或分支名。该命令会将指定的提交应用到当前分支上&#xff0c;并创建一个新的提交。 使用场景 cherry-pick命令…

Jmeter-实现图片的上传和下载

图片上传 选中测试计划右键&#xff0c;添加->线程(用户)->线程组 配置线程组 上面分别是总次数&#xff0c;时间&#xff0c;循环次数&#xff0c;就是字面意思 选中你的线程组右键&#xff0c;添加->取样器->HTTP请求 配置HTTP请求 为了方便观看&#xff0c;这…

【C++基础】13. 结构体

文章目录 【 1. 结构体的定义 】【 2. 结构体成员的访问 】【 3. 结构体变量的声明 】【 4. 指向结构体的指针 】 数组与结构体&#xff1a;C/C 数组允许定义可存储相同类型数据项的变量。而结构体是 C 中另一种用户自定义的可用的数据类型&#xff0c;它允许我们存储不同类型的…

在vscode中配置git bash终端、git 源码管理

打开vscode文件->首选项->设置&#xff0c;打开设置搜索shell windows将以下配置添加到vscode中的settings.json中 注意&#xff1a; terminal.integrated.profiles.windows这个配置项是就是添加终端的terminal.integrated.defaultProfile.windows这个是配置默认选项的…

【Linux初阶】多线程3 | 线程同步,生产消费者模型(普通版、BlockingQueue版)

文章目录 ☀️一、线程同步&#x1f33b;1.条件变量&#x1f33b;2.同步概念与竞态条件&#x1f33b;3.条件变量函数&#x1f33b;4.条件变量使用规范&#x1f33b;5.代码案例 ☀️二、生产者消费者模型&#x1f33b;1.为何要使用生产者消费者模型&#x1f33b;2.生产者消费者模…