计算机视觉与OpenCV入门指南
立即解锁
发布时间: 2025-08-21 01:23:42 阅读量: 1 订阅数: 7 


OpenCV 3计算机视觉实战指南
### 计算机视觉与OpenCV入门指南
#### 1. 计算机视觉概述
计算机视觉是一个广泛的领域,它是将静态或视频相机的数据转换为决策或新表示的过程,所有这些转换都是为了实现特定目标。输入数据可能包含一些上下文信息,例如“相机安装在汽车上”或“激光测距仪显示物体距离为1米”。决策可能是“此场景中有一个人”或“此幻灯片上有14个肿瘤细胞”。新表示可能意味着将彩色图像转换为灰度图像或从图像序列中去除相机运动。
然而,由于人类是视觉生物,很容易误以为计算机视觉任务很简单。但实际上,人类大脑处理视觉信号的方式非常复杂,它将视觉信号分成多个通道,有注意力系统来识别图像的重要部分,并存在大量反馈机制,还能结合多年的生活经验进行跨关联。而在机器视觉系统中,计算机通常只接收到相机或磁盘中的数字网格,缺乏内置的模式识别、自动对焦和光圈控制以及与多年经验的跨关联,视觉系统仍然相当“幼稚”。
此外,计算机视觉面临着一个根本性的难题:从二维视图重建三维世界信号是一个不适定问题,没有唯一或确定的解决方案。同一二维图像可以代表无限多种三维场景的组合,而且数据还会受到噪声和失真的影响,这些噪声和失真来自于世界的变化(天气、光照、反射、运动)、镜头和机械设置的缺陷、传感器的有限积分时间(运动模糊)、传感器或其他电子设备的电气噪声以及图像捕获后的压缩伪像。
为了应对这些挑战,在实际系统设计中,可以利用额外的上下文知识来克服视觉传感器的限制。例如,移动机器人在建筑物中寻找和拾取订书机时,可以利用桌子通常在办公室内以及订书机大多在桌子上的事实,这不仅提供了隐含的尺寸参考,还能避免在不可能的地方错误地“识别”订书机。上下文信息也可以通过机器学习技术进行显式建模,或者使用额外的传感器来测量隐藏的偏差变量,如使用激光测距仪测量深度以准确测量物体的大小。
对于噪声问题,通常使用统计方法来处理。例如,仅通过比较一个点与其相邻点来检测图像中的边缘可能很困难,但如果查看局部区域的统计信息,边缘检测就会变得容易得多。也可以通过对时间进行统计来补偿噪声,还可以通过直接从可用数据中学习显式模型来处理噪声或失真,如通过学习简单多项式模型的参数来校正镜头失真。
计算机视觉基于相机数据做出的动作或决策是在特定目的或任务的背景下进行的。不同的应用场景,如安全系统、游乐园监控系统、机器人视觉软件等,由于上下文和目标不同,会采用不同的策略。一般来说,计算机视觉的上下文约束越多,就越能依靠这些约束来简化问题,最终解决方案也会更可靠。
#### 2. OpenCV简介
OpenCV旨在提供解决计算机视觉问题所需的基本工具。在某些情况下,库中的高级功能足以解决计算机视觉中的更复杂问题;即使不行,库中的基本组件也足够完整,可以让用户自己创建几乎任何计算机视觉问题的完整解决方案。使用OpenCV时,可以先尽可能多地使用可用的库组件来解决问题,开发出初稿解决方案后,找出其弱点并使用自己的代码进行修复,然后以初稿解决方案为基准评估改进效果,最后利用解决方案所嵌入的更大系统的上下文来解决剩余的弱点。
OpenCV起源于英特尔的一项研究计划,旨在推进CPU密集型应用。英特尔当时发起了许多项目,包括实时光线追踪和3D显示墙。作者之一Gary Bradski在访问大学时,注意到一些顶尖大学的团队(如麻省理工学院媒体实验室)拥有完善且内部开放的计算机视觉基础设施,新学生可以在此基础上开发自己的视觉应用,而无需从头开始重新实现基本功能。因此,OpenCV的构想是使计算机视觉基础设施普遍可用。
OpenCV最初由英特尔的研究实验室发起,与软件性能库团队合作,并在俄罗斯团队的实现和优化专业知识支持下开始。俄罗斯团队的主要成员包括Vadim Pisarevsky、Victor Eruhimov和Valery Kuriakin等。OpenCV的初始目标包括:
- 提供开放且优化的基本视觉基础设施代码,推动视觉研究,避免重复造轮子。
- 提供一个通用的基础设施,促进视觉知识的传播,使代码更易于阅读和转移。
- 通过免费提供可移植、性能优化的代码,推动基于视觉的商业应用,且不要求商业应用本身开放或免费。
如今,OpenCV已经有大约1100万次下载,并且每月平均新增16万次下载。它收到了许多用户贡献,核心开发也大多转移到了英特尔之外。OpenCV的发展受到了互联网泡沫的兴衰以及管理和方向的多次变化的影响,但随着多核处理器的出现和计算机视觉的众多新应用,其价值开始上升。机器人领域的快速发展也推动了该库的大量使用和开发。目前,OpenCV由OpenCV基金会以及一些公共和私人机构积极开发。
#### 3. OpenCV的结构和加速
OpenCV采用分层结构构建,其顶层是操作系统,接下来是语言绑定和示例应用程序,再下面是opencv_contrib中的贡献代码(主要包含高级功能),然后是OpenCV的核心,底层是硬件加速层(HAL)中的各种硬件优化。
在英特尔处理器上,如果可用,OpenCV可以利用英特尔集成性能原语(IPP)库的免版税子集IPP 8.x(IPPICV)。在编译阶段可以将IPPICV链接到OpenCV中,它会替换相应的低级优化C代码(在CMake中使用WITH_IPP=ON/OFF,默认ON)。使用IPP可以显著提高速度。
#### 4. OpenCV的所有权和下载安装
OpenCV虽然由Gary Bradski在英特尔发起,但它是开放和免费的,旨在促进商业和研究使用。代码本身可以在其他应用程序中使用或嵌入(全部或部分),无论是商业应用还是研究应用,不强制要求应用程序代码开放或免费,也不要求将改进反馈回库中,但希望用户能够这样做。
可以从OpenCV的主网站下载最新版本的完整源代码以及许多近期版本。最新版本始终可以在GitHub上找到,对于更近期的高级功能,还可以下载并构建opencv_contrib。
##### 4.1 Windows安装
- 访问http://opencv.org/downloads.html,下载适用于Windows的最新版本OpenCV,这是一个可执行文件,是为各种版本的Visual Studio预构建的OpenCV二进制文件的自解压存档。
- 添加OPENCV_DIR环境变量,在命令提示符中输入:
```plaintext
setx -m OPENCV_DIR D:\OpenCV\Build\x64\vc10
```
注:具体路径会根据安装情况有所不同,例如在32位机器上,路径可能包含x86而不是x64。
- 如果要静态链接OpenCV,上述步骤就足够了;如果要使用动态链接库(DLL),还需要将%OPENCV_DIR%\bin添加到系统的库路径中。例如,在Windows 10中,右键单击计算机图标,选择“属性”,然后点击“高级系统设置”,最后选择“环境变量”,将OpenCV二进制路径添加到Path变量中。
- OpenCV 3已链接IPP,可获得现代x86和x64 CPU的性能优势。
- 也可以从源tarball构建OpenCV:
1. 运行CMake GUI。
2. 指定OpenCV源树和构建目录的路径(它们必须不同)。
3. 两次按下“Configure”(选择适当的Visual Studio生成器,或如果使用MinGW则选择MinGW makefiles),然后按下“Generate”。
4. 在Visual Studio中打开生成的解决方案并进行构建;如果使用MinGW,则按照Linux的说明进行操作。
##### 4.2 Linux安装
由于不同Linux发行版(如SuSE、Debian、Ubuntu等)中GCC和GLIBC的版本差异很大,Linux版OpenCV不包含预构建的二进制文件。在许多情况下,发行版会包含OpenCV;如果没有,则需要从源代码构建。可以从http://opencv.org/downloads.html开始下载,链接会将你带到SourceForge,在那里可以选择当前OpenCV源代码包的tarball。
构建库和演示程序需要以下依赖:
- GTK+ 2.x或更高版本,包括头文件。
- gcc和基本开发包、cmake和libtbb(英特尔线程构建块),可选的zlib、libpng、libjpeg、libtiff和libjasper的开发文件(即包名以 -dev 结尾的版本)。
- Python 2.6或更高版本,包括头文件(开发包),以及NumPy以支持Python绑定。
- ffmpeg的libavcodec和其他libav*库(包括头文件)。可以安装发行版提供的libav/ffmpeg包,或从http://www.ffmpeg.org下载ffmpeg。由于ffmpeg库采用Lesser General Public License(LGPL),但其某些组件采用更严格的General Public License(GPL),为了与非GPL软件(如OpenCV)一起使用,需要构建和使用共享的ffmpeg库:
```plaintext
$> ./configure --enable-shared
$> make
$> sudo make install
```
构建库的步骤如下:
```plaintext
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make
sudo make install # 可选
```
上述命令中,前两个命令创建一个新的子目录并进入该目录;第三个命令告诉CMake如何配置构建,示例选项可能是开始构建的正确选择,但其他选项可以启用各种功能、确定要构建的示例、添加Python支持、添加CUDA GPU支持等。默认情况下,OpenCV的cmake配置脚本会尝试查找并使用尽可能多的第三方库,例如如果找到CUDA SDK,会启用GPU加速的OpenCV功能。最后两个命令实际构建库并将结果安装到适当的位置。需要注意的是,在基于CMake的项目中使用OpenCV时,不一定要安装它,只需指定生成OpenCVConfig.cmake的路径即可。在上述情况下,如果不运行sudo make install,该文件将放在release目录中;如果运行了,则会放在/usr/local/share/OpenCV中。与Windows情况一样,Linux版OpenCV在安装IPP后会自动利用其优势。从OpenCV 3.0开始,OpenCV的cmake配置脚本会自动下载并链接IPP的免费子集(IPPICV),如果不想使用IPP,可以在CMake中传递 -D WITH_IPP=OFF 选项。
### OpenCV安装流程mermaid图
```mermaid
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A([开始]):::startend --> B{选择系统}:::process
B -->|Windows| C(下载OpenCV可执行文件):::process
B -->|Linux| D(下载OpenCV源代码tarball):::process
C --> E(添加OPENCV_DIR环境变量):::process
E --> F{是否静态链接}:::process
F -->|是| G(完成安装):::process
F -->|否| H(添加DLL路径到系统库路径):::process
H --> G
D --> I(安装依赖库):::process
I --> J(构建共享ffmpeg库):::process
J --> K(创建并进入release目录):::process
K --> L(运行cmake配置):::process
L --> M(编译和安装):::process
M --> N(可选: 安装OpenCV):::process
N --> O(完成安装):::process
G --> P([结束]):::startend
O --> P
```
### OpenCV结构表格
| 层次 | 描述 |
| ---- | ---- |
| 操作系统层 | OpenCV运行的操作系统环境 |
| 语言绑定和示例应用层 | 提供不同语言的绑定以及示例应用程序 |
| opencv_contrib层 | 包含贡献代码,主要是高级功能 |
| 核心层 | OpenCV的核心功能部分 |
| 硬件加速层(HAL) | 各种硬件优化 |
### 计算机视觉与OpenCV入门指南
#### 5. 计算机视觉任务的复杂性与应对策略
计算机视觉任务看似简单,实则充满挑战。人类在处理视觉信息时,大脑有着复杂的机制。它将视觉信号分成多个通道,有专门的注意力系统来聚焦重要部分,还存在大量反馈机制,并且能结合多年生活经验进行跨关联。例如,当我们看到一张汽车的图片,能轻松识别出汽车的各个部件。
然而,计算机视觉系统却面临诸多难题。计算机接收到的只是相机或磁盘中的数字网格,缺乏内置的模式识别能力,也没有自动对焦和光圈控制,更无法利用过去的经验进行跨关联。以识别汽车的侧后视镜为例,计算机看到的仅仅是一堆数字,每个数字还包含较大的噪声成分,从中提取出“侧后视镜”的感知并非易事。
而且,从二维视图重建三维世界信号是一个不适定问题。同一二维图像可以代表无限多种三维场景的组合,即使数据完美,也无法唯一确定三维信号。再加上数据还会受到噪声和失真的影响,如天气、光照、反射、运动等世界变化,镜头和机械设置的缺陷,传感器的有限积分时间导致的运动模糊,传感器或其他电子设备的电气噪声,以及图像捕获后的压缩伪像等。
为了应对这些挑战,我们可以采取以下策略:
- **利用上下文知识**:在实际系统设计中,额外的上下文信息能帮助我们克服视觉传感器的限制。例如,对于一个需要在建筑物中寻找和拾取订书机的移动机器人,它可以利用“桌子通常在办公室内”以及“订书机大多在桌子上”的事实。这不仅为订书机的大小提供了隐含参考,还能避免在不可能的地方(如天花板或窗户上)错误地“识别”订书机。
- **机器学习建模**:可以使用机器学习技术对上下文信息进行显式建模。通过将隐藏变量(如物体的大小、相对于重力的方向等)与标记训练集中的值进行关联,从而更好地理解和处理视觉数据。
- **使用额外传感器**:借助额外的传感器来测量隐藏的偏差变量。例如,使用激光测距仪测量物体的深度,从而准确确定物体的大小。
- **统计方法处理噪声**:对于噪声问题,通常采用统计方法。比如,仅通过比较一个点与其相邻点来检测图像中的边缘可能很困难,但如果查看局部区域的统计信息,边缘检测就会变得容易得多。一个真正的边缘应该在局部区域内表现为一串相邻点的响应,且每个点的方向与其相邻点一致。此外,还可以通过对时间进行统计来补偿噪声,或者通过直接从可用数据中学习显式模型来处理噪声或失真,如通过学习简单多项式模型的参数来校正镜头失真。
#### 6. OpenCV在不同场景下的应用策略
计算机视觉基于相机数据做出的动作或决策是在特定目的或任务的背景下进行的。不同的应用场景,由于上下文和目标不同,会采用不同的策略。
| 应用场景 | 特点 | 策略 |
| ---- | ---- | ---- |
| 安全系统 | 需要实时监测异常情况,如有人试图翻越围栏 | 可能需要去除图像中的噪声或损坏,以确保准确检测到异常行为 |
| 游乐园监控系统 | 用于统计特定区域内的人流量 | 需要对图像进行处理,准确识别和计数通过的人员 |
| 办公室机器人视觉系统 | 机器人在办公室环境中自主移动和执行任务 | 利用办公室的布局和物体的常见位置等上下文信息,帮助机器人更好地识别和操作 |
| 静止安全摄像头视觉系统 | 固定位置监控特定区域 | 可以根据监控区域的特点进行针对性的图像分析,如设置特定的检测规则 |
一般来说,计算机视觉的上下文约束越多,就越能依靠这些约束来简化问题,最终解决方案也会更可靠。例如,在一个特定的工业生产线上,产品的外观和位置相对固定,计算机视觉系统可以利用这些约束条件,更准确地检测产品的缺陷。
#### 7. OpenCV的发展历程与现状
OpenCV起源于英特尔的一项研究计划,旨在推进CPU密集型应用。当时英特尔发起了许多项目,包括实时光线追踪和3D显示墙。作者之一Gary Bradski在访问大学时,发现一些顶尖大学的团队拥有完善且内部开放的计算机视觉基础设施,新学生可以在此基础上开发自己的视觉应用,而无需从头开始重新实现基本功能。因此,OpenCV的构想是使计算机视觉基础设施普遍可用。
OpenCV最初由英特尔的研究实验室发起,与软件性能库团队合作,并在俄罗斯团队的实现和优化专业知识支持下开始。俄罗斯团队的主要成员包括Vadim Pisarevsky、Victor Eruhimov和Valery Kuriakin等。OpenCV的初始目标包括推动视觉研究、促进视觉知识传播以及推动基于视觉的商业应用。
在发展过程中,OpenCV受到了互联网泡沫的兴衰以及管理和方向的多次变化的影响。曾经有一段时间,英特尔甚至没有人员参与OpenCV的开发。但随着多核处理器的出现和计算机视觉的众多新应用,其价值开始上升。机器人领域的快速发展也推动了该库的大量使用和开发。
如今,OpenCV已经有大约1100万次下载,并且每月平均新增16万次下载。它收到了许多用户贡献,核心开发也大多转移到了英特尔之外。目前,OpenCV由OpenCV基金会以及一些公共和私人机构积极开发。
#### 8. OpenCV使用建议
OpenCV旨在提供解决计算机视觉问题所需的基本工具。在使用OpenCV时,可以遵循以下步骤:
1. **利用现有库组件**:尽可能多地使用OpenCV库中现有的组件来解决问题。OpenCV的库中包含了许多已经实现的功能和算法,能够帮助我们快速搭建起一个初步的解决方案。
2. **评估和改进**:开发出初稿解决方案后,仔细评估其性能和弱点。通过分析解决方案在实际应用中的表现,找出存在的问题。
3. **自定义修复**:针对发现的弱点,使用自己的代码和创意进行修复。这可能涉及到对算法的优化、对数据处理流程的改进等。
4. **基准评估**:以初稿解决方案为基准,评估改进后的效果。通过对比改进前后的性能指标,确定改进是否有效。
5. **结合上下文优化**:利用解决方案所嵌入的更大系统的上下文来解决剩余的弱点。例如,根据具体的应用场景和需求,调整算法的参数或选择更合适的模型。
#### 9. 总结
计算机视觉是一个充满挑战但又极具潜力的领域。它在将相机数据转换为决策或新表示的过程中,面临着诸多难题,如不适定问题、噪声和失真等。然而,通过利用上下文知识、机器学习技术、额外传感器以及统计方法等策略,我们可以逐步克服这些挑战。
OpenCV作为一个强大的计算机视觉库,为我们提供了解决这些问题的基本工具。它具有分层结构,包括操作系统层、语言绑定和示例应用层、opencv_contrib层、核心层和硬件加速层。在英特尔处理器上,还可以利用IPP进行加速。
OpenCV的安装过程因操作系统而异,在Windows和Linux系统上都有详细的步骤。在使用OpenCV时,我们可以遵循一定的步骤,先利用现有库组件搭建解决方案,再进行评估和改进,最终结合上下文进行优化。
总之,掌握计算机视觉和OpenCV的相关知识和技能,将有助于我们在这个领域取得更好的成果,开发出更加高效、可靠的计算机视觉应用。
### OpenCV使用步骤列表
1. 利用现有库组件解决问题
2. 评估初稿解决方案的弱点
3. 使用自定义代码修复弱点
4. 以初稿为基准评估改进效果
5. 结合上下文优化解决方案
### 计算机视觉应对策略mermaid图
```mermaid
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A([开始]):::startend --> B(分析计算机视觉任务):::process
B --> C{是否有上下文信息}:::process
C -->|是| D(利用上下文知识):::process
C -->|否| E(考虑使用机器学习建模):::process
D --> F{是否需要额外信息}:::process
F -->|是| G(使用额外传感器):::process
F -->|否| H(使用统计方法处理噪声):::process
E --> H
G --> H
H --> I(开发解决方案):::process
I --> J(评估和优化):::process
J --> K([结束]):::startend
```
0
0
复制全文
相关推荐






