裁剪opencv库到2Mb

news2025/2/25 0:34:32

  摘要:本文描述了如何对opencv进行裁剪已达到最小化,不限于使用模块编译,去除第三方库依赖,改变编译选项,限制导出符号等。
  关键字opencv导出符号

  opencv库大小优化的文章网络上很少,大部分都是针对opencv的模块进行选择编译进行最小化,当然这也是最简单有效的方式。我这里介绍限制opencv导出符号来优化库大小的一种方式。
  首先简单介绍下既然是最小化库大小那肯定是最小化动态库,因为静态库链接器会自动分析需要哪些符号将对应的符号导出不存在需要进行分析的必要。

1 按照模块编译

  第一步是按照模块编译opencv,尽可能去掉你不需要的一些模块。一般来说core是必须的,不然使用opencv的意义在哪儿。比如下面的imgcodesc,stitching,core等这些模块你得清楚你需要哪些不需要哪些,如果不清楚可以看官方文档。另外这里这么多选项该选哪个不该选哪个很难确定,最简单粗暴的办法就是一个一个试:不断将编译出的库应用到你得程序中直到没有编译错误为止(因此这一步建议编译优化的选项选择编译速度最快的方式),同时需要注意有些选项虽然对编译无影响但是会影响opencv的运行速度比如指令集优化、SSE优化之类的。
在这里插入图片描述

  同时能够去掉一些不需要依赖的一些第三方库比如有jpeg,tiff,webp等,可以根据自己的需求进行调整。
  另外需要注意的是opencv中的模块有些是相互依赖的,可以在opencv源码目录下的modules目录中找到对应的模块的文件夹中的CMakeLists.txt文件寻找ocv_define_module,其中就列举出了依赖的模块。比如示例中calib3d模块就依赖于opencv_imgproc opencv_features2d两个模块,也就是说如果要编译calib3d模块这两个模块也要带上。
在这里插入图片描述

  经过这一步一般opencv的库已经能够减小的比较小了。
  还可以根据不同平台的区别调整编译参数来更进一步降低动态库的大小比如-ffunction等。

2 限制导出符号

  静态库不会使目标库的体积过分大是因为静态库是残酷目标产物链接的,即生成对应目标产物时就已经直到哪些代码是无用的了,就可以丢弃。而动态库需要用户自己定义需要导出的符号才能限制大小,否则全符号导出目标产物体积是很大的。Msvc和gcc可以使用下面的修饰来限制导出符号。

__declspec(dllexport)
__attribute__ ((visibility ("default")))
__attribute__ ((visibility ("hidden")))

  同时clang和gcc可以用--export-dynamic-symbol指定期望导出的符号,一般用于C,因为C的函数name-mangling是清楚的,而C++的要复杂一些。
  基于以上我们可以修改opencv的默认导出函数来降低库大小,首先将opencv默认的导出宏重写,并新定义一个宏。

#ifndef CV_EXPORTS
# if (defined _WIN32 || defined WINCE || defined __CYGWIN__) && defined(CVAPI_EXPORTS)
#   define CV_EXPORTS
#   define CV_USER_DEFINE_EXPORTS __declspec(dllexport)
# elif defined __GNUC__ && __GNUC__ >= 4 && (defined(CVAPI_EXPORTS) || defined(__APPLE__))
#   define CV_USER_DEFINE_EXPORTS __attribute__ ((visibility ("default")))
#   define CV_EXPORTS __attribute__ ((visibility ("hidden")))
# endif
#endif

  这样所有的符号默认都不导出,然后只需要将自定义的导出宏替换到期望导出的符号即可。比如我这边只期望导出Mat

class CV_USER_DEFINE_EXPORTS Mat
{
public:

  此时编译出的大小为2Mb:
在这里插入图片描述

  更进一步,Mat的函数我并不是所有都是用那么就限制对应符号即可,此时仅仅留了一个库,可以看出进一步减少的空间比较小了:
在这里插入图片描述

  然后就是根据你的使用场景来选择导出的符号裁剪库大小。然后我们简单看下目前库的内容,发现其中代码占大头,导出的符号仅仅剩一个了,如果需要继续优化可能就是要在代码上进行裁剪了:

    ordinal hint RVA      name

          1    0 000B7710 ??0Mat@cv@@QEAA@XZ = ??0Mat@cv@@QEAA@XZ (public: __cdecl cv::Mat::Mat(void))

  Summary

        8000 .data
       11000 .pdata
       8B000 .rdata
        2000 .reloc
        1000 .rsrc
      185000 .text
        4000 _RDATA

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

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

相关文章

【C++ 学习 ⑩】- 详解 string 类(下):string 类的模拟实现和写时拷贝

目录 一、string 类的模拟实现 1.1 - string.h 1.2 - test.cpp 二、string 类的写时拷贝 2.1 - 示例 2.2 - 原理 一、string 类的模拟实现 1.1 - string.h #pragma once#include <assert.h> #include <string.h> #include <iostream>namespace yzz {…

mac版android studio设置字体避坑总结

1.整体主题字体设置: setting->Appearance & Behavior->Appearance->Theme: 设置主题 Use custom font:右边的数字是设置除了编辑代码去之外的字体大小 ,推荐使用AppleSystemUIFont 注意这个字体有个bug,就是如果用在终端横向会有空格: 2.设置终端字体: setting-…

PyTorch深度学习实战(5)——计算机视觉

PyTorch深度学习实战&#xff08;5&#xff09;——计算机视觉 0. 前言1. 图像表示2. 将图像转换为结构化数组2.1 灰度图像表示2.2 彩色图像表示 3 利用神经网络进行图像分析的优势小结系列链接 0. 前言 计算机视觉是指通过计算机系统对图像和视频进行处理和分析&#xff0c;利…

云计算基础教程(第2版)笔记——基础篇与技术篇介绍

文章目录 前言 第一篇 基础篇 一 绪论 1.1 云计算的概念以及特征 1.1.1云计算的基本概念 1.1.2云计算的基本特征 1.2 云计算发展简史 1.3 三种业务模式介绍 1. 基础设施即服务&#xff08;IaaS&#xff09; 2. 平台即服务&#xff08;PaaS&#xff09; 3. 软…

TypeScript 学习笔记(二):接口

一、接口的定义 在面向对象的编程中&#xff0c;接口是一种规范的定义&#xff0c;它定义了行为和动作的规范&#xff0c;在程序设计里面&#xff0c;接口起到一种限制和规范的作用。接口定义了某一批类所需要遵守的规范&#xff0c;接口不关心这些类的内部状态数据&#xff0…

spring cloud 之 openFeign

Feign和openFeign Feign Fegin使java Http客户端更加方便简洁&#xff0c; Feign集成了Ribbon、RestTemplate实现了负载均衡的执行Http调用&#xff0c;只不过对原有的方式&#xff08;RibbonRestTemplate&#xff09;进行了封装&#xff0c;开发者不必手动使用RestTemplate调…

【Linux】- Vim 编辑器、开关机、和用户权限管理常用命令

Vim 编辑器、开关机、和用户权限管理常用命令 1.1&#x1f330;vi 和 vim 的基本介绍1.2&#x1f36e;vi 和 vim 常用的三种模式1.3&#x1f320;vim的基本使用2.1&#x1f365;开机、重启2.2&#x1f37c;用户登录注销3.1&#x1f600;用户管理&#xff08;crud&#xff09;3.…

【C++算法模板】快排、归并、二分

目录 快速排序 归并排序 二分算法 整数二分 浮点数二分模板 总结&#xff1a; 快速排序 //快速排序 void quick_sort(int q[], int l, int r) {if (l > r) return;//向下取整可能使得x取到q[l]int i l - 1, j r 1, x q[l r >> 1];while (i < j){do i; …

M芯片Mac实现安卓模拟器多开

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

Linux kernel内存初始化介绍

early_fixmap_init&#xff1a; dtb进行映射&#xff0c;通过设备树文件和membloc模块让内核了解更为广阔的内存世界。Uboot将dtb拷贝到内存中&#xff0c;且通过传递相关参数将dtb的物理地址告知内核。但是内核必须将dtb的相关物理地址映射到虚拟地址上&#xff0c;通过虚拟地…

基于springboot的城乡医疗卫生服务系统

摘 要 网络的广泛应用给生活带来了十分的便利。所以把城乡医疗卫生服务与现在网络相结合&#xff0c;利用java语言建设城乡医疗卫生服务系统&#xff0c;实现城乡医疗卫生服务系统的信息化。则对于进一步提高医院的发展&#xff0c;丰富城乡医疗卫生服务经验能起到不少的促进作…

ModaHub魔搭社区:向量数据库Zilliz Cloud集群、Collection 及 Entity教程

目录 集群 Collection 字段 Schema 索引 Entity Zilliz Cloud 集群由全托管 Milvus 实例及相关计算资源构成。您可以在 Zilliz Cloud 集群中创建 Collection,然后在 Collection 中插入 Entity。Zilliz Cloud 集群中的 Collection 类似于关系型数据库中的表。Collection …

使用React的函数式组件实现一个具有过渡变化、刻度切换、点击高亮的柱状图DIY组件

本想使用业界大佬们开源的各种图表库&#xff08;如&#xff1a;ECharts、G2可视化引擎、BizCharts ...&#xff09;&#xff0c;但是有的需求不仅要求有过渡变化&#xff0c;还要点击某个图高亮同时发送HTTP请求数据等功能&#xff0c;着实不知道怎么把canvas或svg绘制的图表弄…

ElasticSearch入门教程

文章目录 一、Elasticsearch 概述1.1、ElasticSearch是什么&#xff1f;1.2、ElasticSearch的安装 二、ElasticSearch的使用2.1、索引操作2.2、文档操作2.3、映射操作2.4、高级查询操作 一、Elasticsearch 概述 1.1、ElasticSearch是什么&#xff1f; 官网解释如图所示&#…

Rdkit|操作分子对象

github&#xff1a;地址 文章目录 RDKit|操作分子对象引入所需库获取分子中的原子获取原子的坐标信息访问单个原子的信息访问所有原子分子中的键操作获取键的信息 获取分子中所有的环 RDKit|操作分子对象 引入所需库 from rdkit import Chem from rdkit.Chem import Draw获取…

Mysql基本语法+Navicat使用

进入数据库&#xff1a;mysql -uroot -p 修改数据库密码&#xff1a;ALTER USER rootlocalhost IDENTIFIED BY 这里输入密码; &#xff08;如&#xff1a;ALTER USER rootlocalhost IDENTIFIED BY 111111;&#xff09; 创建数据库&#xff1a;create database 数据库名; 查…

刷题记录01

题目一. 这道题要先解释一下什么是非递增,非递增就是a[i] >a[i1],递增则是相反. 非递减就是a[i]>a[i1],递减就是相反 大方向思路是: 遍历数组判断相邻元素的顺序关系统计排序子序列数量 具体思路: 本题依次比较整个数组a[i1]>a[i] &#xff0c;则进入非递增序列判…

在vue中点击弹框给弹框中的表格绑值

场景描述&#xff1a;如下图所示&#xff0c;我们需要点击 ‘账单生成’ 按钮&#xff0c;然后里边要展示一个下图这样的表格。 最主要的是如何展示表格中的内容&#xff0c;一起看看吧&#xff01; <template><!-- 水费 欠费--><el-dialog title"水费欠费…

静态图片转3D动态GIF/视频

Leiapix是一项令人印象深刻的技术&#xff0c;它可以让静态的图片动起来&#xff0c;为观众提供沉浸式和交互式的图像体验。这项创新的技术使用了Leia Inc.的自适应光栅屏幕技术&#xff0c;通过利用人眼的视差和立体视觉效应&#xff0c;将图像中的元素以动态的方式呈现出来&a…

《第一次线下面试总结》

《第一次线下面试总结》 面试时间&#xff1a;2023/7/11 上午10点 面试总时长20分钟。 实习薪资&#xff1a;2.3k…后期看表现&#xff0c;可根据实际情况那啥 。估计是看锤子… 一、HR面 自我介绍你哪里的、目前住哪里等基本信息。你偏向前端还是后端&#xff1f;说说你的项目…