当前位置: 首页 > news >正文

CMake构建学习笔记13-opencv库的构建

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,旨在提供一个跨平台的、易于使用的、快速执行的计算机视觉接口。如果只是简单的使用,其实不必要像笔者这样使用源代码进行构建,直接使用官方提供的二进制安装包即可。一般来说,需要从源代码进行构建的原因有以下几种:

  1. 由于C/C++构建成果的二进制兼容问题,官方提供的安装包或者预编译包比一定能够适配你的编程环境,有的环境也不太可能找到安装包,比如嵌入式、信创。
  2. 构建的成果不一定是你需要的构建类型,例如构建RelWithDebInfo类型。个人认为传统的Debug和Release模式似乎不能满足于目前软件测试能力退化环境了,反而RelWithDebInfo类型更实用一点。例如OpenCV的Release其实就是RelWithDebInfo,因为它同时生成了符号库文件。
  3. 官方提供的安装包或者预编译包不一定有符号库,符号库对于Debug调试非常重要,它可以让我们看到代码文件,让我们知道出问题的具体地方在哪里。虽然说依赖库的bug我们一般改不了,但是可以给我们一点提示让我们正确地调用依赖库,避免崩溃。

笔者构建的是OpenCV的3.4.16版本,这也是OpenCV3.X的最新版本,关键构建指令如下所示:

# 配置阶段,指定生成器、平台和安装路径
cmake .. -G "$Generator" -A x64 `-DCMAKE_BUILD_TYPE=Release `-DCMAKE_PREFIX_PATH="$env:GISBasic" `-DCMAKE_INSTALL_PREFIX="$InstallDir" `-DBUILD_opencv_world=ON `-DWITH_GDAL=OFF `-DWITH_FFMPEG=OFF `-DWITH_IPP=OFF `-DBUILD_TESTS=OFF `-DBUILD_PERF_TESTS=OFF `-DBUILD_opencv_python_tests=OFF `-DBUILD_opencv_python_bindings_generator=OFF `-DBUILD_JAVA=OFF `-DBUILD_opencv_java=OFF `-DBUILD_opencv_java_bindings_generator=OFF `#-DBUILD_ZLIB=OFF `#-DBUILD_JPEG=OFF `#-DBUILD_PNG=OFF `#-DBUILD_TIFF=OFF `#-DWITH_PROTOBUF=ON `#-DBUILD_PROTOBUF=ON `#-DPROTOBUF_UPDATE_FILES=OFF `# 构建阶段,指定构建类型
cmake --build . --config Release# 安装阶段,指定构建类型和安装目标
cmake --build . --config Release --target install

OpenCV具有大量的构建选项,读者可以按需进行构建:

  1. -DBUILD_opencv_world=ON表示将OpenCV的所有模块合并成一个名为opencv_world3416的库。
  2. -DWITH_GDAL=OFF-DWITH_FFMPEG=OFF-DWITH_IPP=OFF像GDAL、FFMPEG这样的都是非常大型的库,如果暂时用不到功能的话就先不用参与构建了。
  3. 其他以“BUILD”开头的选项都是测试、案例、或者其他语言的绑定什么的,如果不需要也不要进行构建了。
  4. OpenCV其实也用到了像zlib、libpng、libjpeg、libtiff等等前面已经构建好的库,如果像BUILD_ZLIB=OFF这样设置,构建OpenCV的时候就会使用已经构建好的库,而不是从OpenCV内部提供的代码重新构建。不过问题在于OpenCV还依赖于protobuf,谷歌的库是另外一套风格,构建出来问题多多,读者就不用尝试了,还是都从OpenCV内部提供的代码重新构建的好。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何克服编程学习中的挫折感?
  • Unity工具篇 专栏目录
  • Python操作 MySQL 之 pysql与SQLAchemy
  • 大数据-113 Flink DataStreamAPI 程序输入源 自定义输入源 非并行源与并行源
  • 开学要买什么?出门少不了续电神器充电宝!性价比超高充电宝
  • android studio .android和.gradle迁移到其他盘
  • VastBase——VPatch版本控制
  • Mysql基础练习题 1084.销售分析3 (力扣)
  • SQL慢查询优化方式
  • 深入理解指针(7)--计算机模拟实现
  • 安科瑞ACR10R网络电力仪表 CE认证 带外置互感器
  • ESP32-IDF http请求崩溃问题分析与解决
  • Ubuntu22.04安装 docker和docker-compose环境
  • c# fromlayout 布局中间空隙问题
  • 无人机培训机构必备运营合格证及驾驶员训练机构合格证详解
  • [NodeJS] 关于Buffer
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • MYSQL 的 IF 函数
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • node学习系列之简单文件上传
  • Promise初体验
  • 力扣(LeetCode)965
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #Lua:Lua调用C++生成的DLL库
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (02)vite环境变量配置
  • (Java入门)学生管理系统
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (译) 函数式 JS #1:简介
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ***监测系统的构建(chkrootkit )
  • .env.development、.env.production、.env.staging
  • .net反编译的九款神器
  • .net经典笔试题
  • .NET开源、简单、实用的数据库文档生成工具
  • .NET运行机制
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [.NET]桃源网络硬盘 v7.4
  • [000-002-01].数据库调优相关学习
  • [100天算法】-目标和(day 79)
  • [100天算法】-实现 strStr()(day 52)
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解
  • [C/C++随笔] char与unsigned char区别
  • [codeforces]Checkpoints
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件
  • [iOS]-UIKit
  • [JavaWeb学习] tomcat简介、安装及项目部署