学习Opencv(蝴蝶书/C++)——1. 前言 和 第1章.概述

news2024/12/28 4:07:14

文章目录

  • 0.前言
    • 0.1 视觉库的发展(计算优化)
    • 0.2 MMX,IPP和Opencv
    • 0.3 书籍及配套代码
    • 0.4 阅读建议
  • 1. 概述
    • 1.1 计算机视觉任务
    • 1.2 Opencv
      • 1.2.1 目标
      • 1.2.2 起源和发展
    • 1.3 Opencv代码库
      • 1.3.1 基本信息
      • 1.3.2 整体架构
    • 参考

0.前言

  • opencv的全名:Open Source Computer Vision Library (OpenCV)
  • 是Intel公司的,主要是Intel公司里的一个俄罗斯软件团队开发的,项目的主要负责人: 在这里插入图片描述
  • 2001年之后开始为人熟知和使用,1999年1月发布alpha版本
  • Opencv库有500多个函数,涵盖工业检测,医学成像,摄像机标定,立体视觉和机器人等。
    • 卫星地图和电子地图的拼接;
    • 医学图像去噪;
    • 物体分析,安全和入侵检测,自动监视和安全系统(现在都用深度学习了)
    • 摄像机标定等。
  • 更详细的介绍见:1.2 Opencv

0.1 视觉库的发展(计算优化)

计算机视觉需要的计算量一般都很大,因此运算速度很重要,而早期计算效率成为这一领域的瓶颈。

直到后来,Interl在1996年发布了MMX,multi media extended技术,其后又出现了SSE,Streaming SIMD Extensions,才使得这个领域看到了曙光。这种基于单指令多数据的多媒体指令集使得图像处理算法的运行速度几倍甚至十几倍的提高,但是要使用这种指令集需要汇编语言。

因此,后续出现了很多使用MMX或者SSE技术优化过的图像处理库,比如:Intel的IPL以及IPP。但是这些库都是很基础的图像处理函数,不能满足复杂的应用技术快速开发的要求,同时这些并不开放源代码。

opencv的优点因此得以凸显,①完全开源;②包含丰富的图像处理及识别函数,且这些函数一般都使用MMX及SSE技术进行了很好的优化。

除了Interl的IPP库和Opencv库,其实还有很多别的库,比如:高校用的matlab,商业软件halcon,visionpro等。

0.2 MMX,IPP和Opencv

这里关于Opencv的函数用MMX及SSE技术优化需要注意:

  1. Opencv里的所有函数并不都是被优化过的,其中只有IPP(不开源的图像处理库)的一部分子集,根据回答What’s exactly the OpenCV IPP integration?,详见:
    • Intel® IPP - Open Source Computer Vision Library (OpenCV) FAQ
      ,主要意思是:对于Opencv3.x及以上,Intel® IPP提供了自己的一个子集——IPP-ICV,其可以很方便的和Opencv一起使用,这个子集的自动集成是由Opencv负责的
    • Installation by Making Your Own Libraries from the Source Files,主要提到的点: Opencv用了Intel Threading Building Blocks (TBB) 技术来帮助利用cpu的多核,②Intel Integrated Performance Primitives (IPP) 技术用来提高 OpenCV 库的颜色转换、Haar 训练和 DFT 函数的性能。需要注意的是,此项技术并不是免费的
  2. 在以前比较旧的版本里,IPPICV是需要额外配置的,详见:Enabling Intel® IPP on OpenCV* (Windows* and Ubuntu*),但是后来的opencv默认集成了IPPICV。
    其实在编译opencv时,可以看到以下内容(会自动下载安装ippicv):
    ...
    -- IPPICV: Downloading ippicv_2021.8_mac_intel64_20230330_general.tgz from https://raw.githubusercontent.com/opencv/opencv_3rdparty/1224f78da6684df04397ac0f40c961ed37f79ccb/ippicv/ippicv_2021.8_mac_intel64_20230330_general.tgz
    -- found Intel IPP (ICV version): 2021.8.0 [2021.8]
    -- at: /Users/XXX/Documents/DailyStudy/cpp/lib/build_opecv/3rdparty/ippicv/ippicv_mac/iw
    ...
    --   Parallel framework:            GCD
    -- 
    --   Trace:                         YES (with Intel ITT)
    -- 
    --   Other third-party libraries:
    --     Intel IPP:                   2021.8 [2021.8.0]
    --            at:                   /Users/XX/Documents/DailyStudy/cpp/lib/build_opecv/3rdparty/ippicv/ippicv_mac/icv
    --     Intel IPP IW:                sources (2021.8.0)
    --               at:                /Users/XX/Documents/DailyStudy/cpp/lib/build_opecv/3rdparty/ippicv/ippicv_mac/iw
    --     Lapack:                      YES (/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Accelerate.framework -lm -ldl)
    --     Eigen:                       NO
    --     Custom HAL:                  NO
    --     Protobuf:                    build (3.19.1)
    --     Flatbuffers:                 builtin/3rdparty (23.5.9)
    -- 
    --   OpenCL:                        YES (no extra features)
    --     Include path:                NO
    --     Link libraries:              -framework OpenCL
    
    

0.3 书籍及配套代码

  • 英文原版书籍主页:Learning OpenCV
    • 代码仓库:Learning OpenCV-gitlab

0.4 阅读建议

  1. 一星期只读两章,一边读一边上手,建议2个月内读完。
  2. 不一定非要按照顺序,11和12章除外;也不是非要看完,1~3章看完后,就可以挑感兴趣的看了。

1. 概述

1.1 计算机视觉任务

视觉问题不可解(是个病态问题)

  • 给出3d对象的2d视图,是没有固定方法来重建出3d信息的,理论上,这种病态问题没有唯一和确定的解。
  • 视觉问题的病态本质:随着视点的变化,物体的二维外观的变化会很大

上下文信息的使用:

  • 在设计实际系统时,为了克服视觉传感器的限制,通常会使用一些上下文信息。
  • 比如:让机器人寻找订书机,在设计系统时,给一个优先去桌子上寻找的规则(先验知识)。这样可以屏蔽很多无关的位置,以及其它与订书机形状类似,但是在桌子以外的地方的物体。
  • 但是在图像检索任务中,数据库里的订书机图像都是对着真正的订书机拍的,同时基本都是位于画面中央。因此由人拍摄的图像中,具有相当多的隐含信息
  • 对计算机视觉应用环境的约束越多,则越能够使用这些约束来简化问题(先验知识)

建模上下文信息

  • 用机器学习对上下文信息显示的建模
  • 隐含的变量,例如物体的大小,重力方向或者其他变量,都可以通过标记好的训练数据集的数值来校正;或者可以通过传感器来测量隐含的变量,例如:激光扫描仪可以精确测量出一个物体的大小

引入环境信息带来的噪声

  • 但是传感器数据会不可避免的带来很多噪声
    • 例如:摄像机在采集图像时,受到真实世界变化的影响(天气,光线,运动等);镜头和机械结构的不完美,传感器上的长时间感应(运动模糊),传感器上和其它电子器件上的电子噪声;以及图像采集后图像压缩引入的变化。
  • 一般使用统计的方法来克服噪声。例如:
    • 一般不可能通过比较一个点和它紧密相邻的点来检测边缘,但是基于局部区域的统计特征的话,进行边缘检测则会比较容易,即局部区域卷积的响应连成的点串,构成边缘
    • 也可以用时间维度上的统计来抑制早上,比如:视频的前后帧
  • 也可以从数据中学习显示模型来解决噪声和畸变问题
    • 例如:镜头畸变,可以通过学习一个简单多项式模型的参数来描述这种畸变,这种方式几乎可以完全矫正这种畸变。

1.2 Opencv

1.2.1 目标

  • 为解决计算机视觉问题提供基本工具;
  • 在某些情况下,其提供的高层函数也可以高效的解决一些复杂问题。
  • 没有高层函数时,依靠其提供的基本函数也足以为大多数计算机视觉问题创建一个完整的解决方案。
  • 解决实际遇到的问题,而不是你想象出来的问题(一定是先出来一个基本版本,然后基于此再逐步改进)

1.2.2 起源和发展

在这里插入图片描述

  • 1998年,Intel内部有了创建一个开发视觉库的想法;
  • 1999年,OpenCV开源
  • 2000年,在CVPR2000会议上,第一个公开的release版本发布
  • 2005年,OpenCV团队获得DARPA挑战赛的胜利,10小时内机器自动穿越160km的沙漠,详见:人类早期驯服野生自动驾驶汽车的珍贵史料
  • 2006年10月,OpenCV1.0发布
  • 2008年,Itseez和Willow Garage这两个机构开始支持OpenCV的开发(后者支持了5年)
  • 2009~2010年,C++成为OpenCV的主要语言,python和java的接口也基本完成
  • 2012年中,Android和IOS端侧的OpenCV库支持提上日程
  • 2012年末,OpenCV项目迁移到了Github
  • 2015年,OpenCV3.0发布,接口有了很大的提升,同时包括了基于OpenCL的T-API,以及Intel、AMD和NVIDIA等平台的优化(所以从3.x版本之后,改动就没有很大了,更多是对深度学习和其他平台、语言的支持,详见1.3.2 整体架构介绍
  • 2016年中,Opencv的核心人员从Itseez又回到了Intel,相较于最初1998年人员规模增加了3倍
  • 2016年末,提供了DNN模块和JavaScript支持
  • 2018年中,使用OpenVINO作为OpenCV的DNN模块后端的版本发布
  • 2018年末,OpenCV4.0发布,使用了C++11的语法(C++11是2011年发布的C++标准)。新加入了3D重构和QR码检测
  • 2019年开始,有了三个开发团队,分别是Intel,OpenCV China和Xperience AI
  • 最近,开始CV课程,Opencv.AI和硬件

参考:

  • Opencv-anniversary,页面搜索Timeline
  • Opencv的Contributer——提PR的个人开发者:
    • https://github.com/opencv/opencv/graphs/contributors
    • https://github.com/opencv/opencv/wiki/Individual-Contributors,这个页面并不怎么更新
  • 提供支持的机构:
    • https://github.com/opencv/opencv/wiki/Contributors

1.3 Opencv代码库

1.3.1 基本信息

  1. 遵循BSD协议,
    • 详见BSD协议,简单来说,就是可以商用,但是希望发布内容中包含原先库的BSD协议信息。
  2. 但是有一些专利保护的算法,被单独放在了“non-free” module。,
    • 并不是确实有一个实际的文件夹形式的module叫做non-free,只是说把受到专利保护的方法,放在一起了。
    • 但是并不是说不能用,如果是商业使用,需要从拥有者那里购买或者获得许可;如果是个人研究学习的目的,则可以用
    • 最著名的一个受专利保护的:SIFT算法,在2020年之后,专利到期了,也就可以使用了。详见:喜大普奔 | 专利到期!SIFT算法免费可用了
    • 可以在之前的记录中看到:opencv_contrib/modules/xfeatures2d/README.md 在这里插入图片描述
    • 现在受保护的除了之前的几个,还新加了几个,
      在这里插入图片描述
  3. 支持主流平台,包括Android,IOS和Windows(有编译好的sdk,Windows的是release版本的,如果要debug版本的话还是要自己编译),以及linux和macOS(需要自己编译),跨平台便携的API
    在这里插入图片描述
  4. C++写的(实时性能),但是有python、java和matlab等的接口
  5. 2500+的算法和函数
  6. 应用:谷歌街景,NASA的火星机器人探索,中国用来进行硬币的质检

1.3.2 整体架构

这部分内容有点长,写到扩展里去了,详见:学习Opencv(蝴蝶书/C++)相关——1. 前言 和 第1章.概述

参考

  • http://16423.courses.cs.cmu.edu/slides/Lecture_2.pdf
  • 学习OpenCV(中文版) .pdf
  • 细致理解 OpenCV

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

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

相关文章

Java精品项目源码第60期糖尿病之家(代号V060)

Java精品项目源码第60期糖尿病之家(编号V60) 大家好,小辰今天给大家介绍一个糖尿病之家论坛交流系统,演示视频公众号(小辰哥的Java)对号查询观看即可 文章目录 Java精品项目源码第60期糖尿病之家(编号V60)难度指数(中…

【再更新】多分式标注(船新版本)

这篇是 多分式标注 脚本工具的第二次更新。 原文章及第一次更新详情请点击链接 【ArcGIS 脚本工具】生成多分式标注 【更新】多分式标注 脚本工具 更新内容 1.优化标注显示:可对生成后的分式标注加阴影或背景,不影响标注的正常显示; 更新…

activitycompat.requestPermissions不弹出弹窗问题

今天使用动态请求权限,但是弹窗怎么样都弹不出来后来发现,把targetsdk降低就好了 改成

【2021集创赛】Risc-v杯一等奖:自适应噪声环境的超低功耗语音关键词识别系统

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位:东南大学 队伍名称:Hey Siri 指导老师:刘波 参赛队员:钱俊逸、张人元、王梓羽 总决赛奖项:全国一等奖 摘要…

不可错过!9个提供高质量免扣PNG素材的网站推荐!

1) 即时设计 即时设计是一款专业的 UI 设计工具,其设计功能强大,同时也是一款具有海量优质图片的PNG素材网站。即时设计的图片素材均来自于 Unsplash,包括头像、动物、建筑、食物、风景等不同种类,图片清晰质量高,可以…

AI时代项目经理成长之道:ChatGPT让项目经理插上翅膀

AI时代项目管理新模式 一本专注于帮助项目经理在AI时代实现晋级、提高效率的图书。 100%提高管理效率:揭秘ChatGPT与项目管理高效融合的核心方法论和实践经验。 为什么要买这本书? AI不会取代你,会用AI的人将取代你 21世纪的核心竞争力就是…

VMware Workstation 17安装教程之创建普通用户

创建普通用户 Subscription Manager。它指的是红帽产品订阅服务,是红帽公司的一项收费服务,我们暂时不需要。 安装完毕后等待重启 安装后的收尾工作 接受红帽许可协议 返回到初始化界面,单击FINISH CONFIGURATION按钮进行确认后&#xff0…

人工智能AI 全栈体系(十一)

第一章 神经网络是如何实现的 这些神经网络越来越复杂,都是用BP算法求解。网络有些变化就可能需要重新推导,而在实验过程中可能会做很多尝试,这样每次都重新推导BP算法太麻烦了。 十、深度学习框架 现在有了很多深度学习框架,这…

利用Nginx负载均衡、动静分离特性部署前后端项目

目录 一、Nginx简介 1.1 Nginx是什么? 1.2 Nginx的作用 二、Nginx负载均衡 2.1 Nginx安装 2.2 Nginx搭载负载均衡 2.2.1 tomcat负载均衡 2.2.2 服务器的集群 三、前后端分离项目 3.1 前端项目导出 3.2 前端项目Linux部署 一、Nginx简介 1.1 Nginx是什么…

外接移动硬盘/U盘无法读写解决方案

一:问题描述 将常用的便携移动硬盘/U盘插入终端,终端无法读取移动硬盘/U盘,并出现“无法访问 介质受写入保护”或“拒绝访问”等报错信息。 二:解决方案 方案一:磁盘设置只读属性,清除磁盘只读属性。 操作…

UL1363跨境电商排插测试报告要提供哪些资料

排插UL1363测试项目及测试方法的介绍 1、漏电流测试 TVSS的样品应与标称电压连接。该测量表的输入阻抗等于1500ohm电阻的阻抗,该电阻旁接一个0.15μF的电容。该电阻放置在接地电源导体和可触及的金属零件之间或裹在外壳上的金属铜箔和插入插座的插头的接地接线柱之间…

open mp笔记

Open mp在cpu上并行计算, 统一内存访问(OPEN MP pthreads),同一块内存共享多个CPU 非统一内存访问(MPI),每个CPU都有自己对应的内存,通过blus interconnect链接起来,cpu不能直接访问他们的内存,…

双11消费遇冷?如何让消费回归心智原点

近一年来,小红书话题「重新养育自己」引热议。直面成长缺憾,不少人探寻解决方案,即像对待新生命般,不论是衣食住行还是心灵,重新关照自己。 借此,本期千瓜将锁定小红书热门话题背后的消费观转变&#xff0…

手写数字识别--神经网络实验

实验源码自取: 神经网络实验报告源码.zip - 蓝奏云 上深度学习的课程,老师布置了一个经典的实验报告,我做了好久才搞懂,所以把实验报告放到CSDN保存,自己忘了方便查阅,也为其他人提供借鉴 由于本人是小白…

2023年11月1日,Google全新域名来袭:.ing域名现已问世!

2023年11月1日(Oct31,2023美国与中国时差)Google宣布,正式推出.ing域名,这是一种新的顶级域名,旨在为用户提供更多的选择和创意。.ing域名是由Google和国际互联网名称与数字地址分配机构(ICANN)合作开发的,…

安全与HTTP协议:为何明文传输数据成为争议焦点?

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、H…

自动驾驶算法(二):A*算法讲解与代码实现

目录 1 A* 算法提出的动机 2 A*算法代码详解 3 A*算法完整代码 1 A* 算法提出的动机 减少收录的珊格树目,增加搜索速度。在Dijkstra算法中,我们考虑收录栅格时我们考虑的是到起点的距离,我们会考虑收录距离起点较近的珊格进行收录。在A*算法…

关于打包css找不到报错

背景&#xff1a;最近公司产品升级为v3项目&#xff0c;打包总是报css缺失 问题&#xff1a;报错提示如下&#xff0c;找不到css 出现原因分析&#xff1a;由于项目比较老&#xff0c;很多人写的&#xff0c;代码风格不统一导致的&#xff0c;比如父组件A使用<style><…

日志数据库写入数据频繁内存占用越来越大

一直写数据&#xff0c;内存越来越高。查看内存占用命令&#xff1a;htop 解决方式&#xff1a;日志数据库的模式改为【简单】 完整会把你的所有操作记录早日志文件&#xff0c;简单就不会

虾总管:16年磨一剑,引领餐饮新现象级潮流

在繁忙的都市生活中&#xff0c;我们常常追求一种简单而美好的生活。美食&#xff0c;则是让我们忘却烦恼&#xff0c;回归初心的一种方式。在河北承德&#xff0c;就有这样一家美食品牌虾总管&#xff0c;用一份鸭虾锅带给无数人美好和喜悦。 16年始终如一&#xff0c;初心不改…