《OpenCV:视觉世界的魔法钥匙》
《OpenCV:视觉世界的魔法钥匙》
- 一、OpenCV 是什么
- 1. 起源与发展支持
- 2. 特点与优势
- 3. 编程语言支持
- 二、OpenCV 的发展历程
- 1. 重要版本发布时间线
- 2. 版本更新内容
- 三、OpenCV 的主要功能
- 1. 图像处理
- 2. 特征提取
- 3. 目标检测
- 4. 运动分析
- 5. 人脸识别
- 6. 其他功能
- 四、OpenCV 的应用场景
- 1. 安全监控
- 2. 医疗影像分析
- 3. 自动驾驶
- 4. 增强现实 / 虚拟现实
- 5. 无人机技术
- 6. 机器人技术
- 7. 工业自动化
- 五、如何学习 OpenCV
- 1. 安装 OpenCV
- 2. 学习编程语言
- 3. 学习基础知识
- 4. 练习实际应用
- 5. 参与社区
一、OpenCV 是什么
OpenCV 是一个基于 BSD 许可发行的跨平台计算机视觉库,由一系列 C 函数和少量 C++ 类构成,同时提供多种语言接口,实现了图像处理和计算机视觉方面的很多通用算法。
1. 起源与发展支持
OpenCV 于 1999 年由 Intel 建立,其主要目标是为计算机视觉研究人员和开发者提供一个开源的、可被 UI 调用的实时计算机视觉库,并为 Intel 处理器做了特定优化。如今,OpenCV 由 Willow Garage 提供支持。在其发展历程中,经历了多个重要阶段:
- 1999 年 1 月,CVL 项目启动。
- 2000 年 6 月,第一个开源版本 OpenCV alpha 3 发布。
- 2000 年 12 月,针对 linux 平台的 OpenCV beta 1 发布。
- 2006 年,支持 Mac OS 的 OpenCV 1.0 发布。
- 2009 年 9 月,OpenCV 1.2(beta2.0)发布。
- 2009 年 10 月 1 日,Version 2.0 发布。
- 2010 年 12 月 6 日,OpenCV 2.2 发布。
- 2011 年 8 月,OpenCV 2.3 发布。
- 2012 年 4 月 2 日,发布 OpenCV 2.4。
- 2013 年 07 月 03 日,OpenCV 2.4.6 发布,主要更新是关于手持设备方面,OpenCV 2.3 的 Android
build 变成官方支持的 NDK-Build 方式,且新的 Android 支持由 NVidia 在开发,OpenCV 本来就支持
CUDA 显卡加速。 - 2013 年 12 月 31 日,OpenCV 2.4.8 发布。
- 2014 年 4 月 25 日,OpenCV 2.4.9 发布。
- 2014 年 8 月 21 日,OpenCv 3.0 alpha 版本发布。
- 2014 年 11 月 11 日,OpenCv 3.0 beta 版本发布。
- 2015 年 6 月 4 日,OpenCV 3.0 版本发布。
- 2015 年 7 月 30 号,OpenCV2.4.12 版本发布。
- 2015 年 12 月 21 日,OpenCV3.1 版本发布。
- 2016 年 12 月,发布 OpenCV 3.2 版,合并 969 个修补程序,关闭 478 个问题。
- 2017 年 8 月 3 日,发布 OpenCV 3.3 版,最重要的更新是把 DNN 模块从 contrib 里面提到主仓库。
- 2018 年 7 月 4 日,OpenCV3.4.2 版本发布。
2. 特点与优势
OpenCV 具有轻量级且高效的特点,它不依赖外部库,部分以 C 语言编写,可在多种平台运行。对非商业和商业应用免费,执行速度快,可通过购买 Intel 的 IPP 库进一步提升速度。
OpenCV 的优势主要体现在以下几个方面:
- 计算机视觉市场巨大且持续增长,但这方面没有标准
API。目前的计算机视觉软件主要有三种:研究代码(慢、不稳定、独立且与其他库不兼容)、耗费很高的商业化工具(如
Halcon、MATLAB+Simulink)、依赖硬件的一些特别的解决方案(如视频监控、制造控制系统、医疗设备)。而 OpenCV
致力于成为标准的 API,简化计算机视觉程序和解决方案的开发。 - OpenCV 致力于真实世界的实时应用,通过优化的 C 代码的编写对其执行速度带来了可观的提升,并且可以通过购买 Intel 的 IPP
高性能多媒体函数库得到更快的处理速度。
3. 编程语言支持
OpenCV 主要用 C++ 编写,保留大量 C 语言接口,也有 Python、Java、MATLAB 等多种语言接口,2010 年 9 月开始实现 GPU 接口。
OpenCV 的编程语言支持非常广泛,具体如下:
- C++:是 OpenCV 的主要开发语言,其主要接口也是 C++ 语言,所有新的开发和算法都是用 C++ 接口。
- Python:OpenCV 提供了 Python 接口,因其简洁易学的特性,在学术研究和快速原型开发中特别受欢迎。
- Java:OpenCV 有 Java 接口,允许 OpenCV 被集成到更广泛的平台和应用中。
- MATLAB/OCTAVE:OpenCV 提供了 MATLAB/OCTAVE 的接口,主要用于算法研究和教学中。
- 此外,OpenCV 如今也提供对于 C#、Ch、Ruby 的支持。这些语言的 API 接口函数可以通过在线文档获得。一个使用 CUDA 的
GPU 接口也于 2010 年 9 月开始实现。
二、OpenCV 的发展历程
OpenCV 自 1999 年启动 CVL 项目以来,不断发展壮大,成为计算机视觉领域广泛应用的开源库。
1. 重要版本发布时间线
1999 年,CVL 项目启动,为计算机视觉研究和应用奠定了基础。2000 年,OpenCV 发布了多个开源版本,包括 OpenCV alpha 3 和针对 Linux 平台的 OpenCV beta 1。2006 年,支持 Mac OS 的 OpenCV 1.0 版本发布,标志着 OpenCV 开始在更多操作系统上得到应用。此后,OpenCV 几乎每年都有新版本发布,不断为用户带来新的功能和性能提升。
从 2009 年开始,OpenCV 的发展进入了一个快速阶段。2009 年 9 月,OpenCV 1.2(beta2.0)发布;同年 10 月 1 日,Version 2.0 发布。随后的几年里,OpenCV 陆续发布了多个版本,如 2010 年 12 月 6 日的 OpenCV 2.2、2011 年 8 月的 OpenCV 2.3、2012 年 4 月 2 日的 OpenCV 2.4 等。
2014 年,OpenCV 3.0 alpha 和 beta 版本相继发布,为用户带来了更多的创新和改进。2015 年 6 月 4 日,OpenCV 3.0 正式版本发布,进一步提升了 OpenCV 在计算机视觉领域的地位。此后,OpenCV 继续保持快速的发展节奏,不断推出新的版本,如 2015 年 7 月 30 号的 OpenCV2.4.12 版本、2015 年 12 月 21 日的 OpenCV3.1 版本等。
2016 年 12 月,OpenCV 3.2 版发布,合并了 969 个修补程序,关闭了 478 个问题,提高了软件的稳定性和可靠性。2017 年 8 月 3 日,OpenCV 3.3 版发布,最重要的更新是把 DNN 模块从 contrib 里面提到主仓库,进一步增强了 OpenCV 在深度学习领域的应用能力。2018 年 7 月 4 日,OpenCV3.4.2 版本发布,为用户带来了更多的功能和性能优化。
2. 版本更新内容
OpenCV 的每个版本都带来了丰富的更新内容,不断提升其在计算机视觉领域的应用价值。
例如,在 OpenCV 2.x 版本中,主要使用 CMake 构建,加入了很多新特征、描述子等,如 FAST、LBP 等。同时,OpenCV 的模块也变得更加规范和易于使用,像 opencv_imgproc、opencv_features2d 等模块的出现,为用户提供了更加方便的图像处理和特征提取功能。此外,opencv_contrib 用于放置尚未成熟的代码,为开发者提供了一个尝试新功能和技术的平台。
在 OpenCV 3.x 版本中,大部分方法都使用了 OpenCL 加速,提高了算法的执行效率。同时,默认包含以及使用 IPP,进一步提升了性能。此外,matlab bindings、Face Recognition、SIFT、SURF、text detector、motion templates & simple flow 等都移到了 opencv_contrib 下,不仅存放了尚未稳定的代码,同时也存放了涉及专利保护的技术实现。大量涌现的新方法也包含在其中,为用户提供了更多的选择和创新空间。
2016 年 12 月发布的 OpenCV 3.2 版,合并了 969 个修补程序,关闭了 478 个问题,提高了软件的稳定性和可靠性。2017 年 8 月 3 日发布的 OpenCV 3.3 版,把 DNN 模块从 contrib 里面提到主仓库,增强了 OpenCV 在深度学习领域的应用能力。同时,OpenCV 开始支持 C++ 11 构建,为开发者提供了更加现代化的编程环境。
2018 年 10 月发布的 OpenCV 4.0.0 版本,OpenCV 开始需要支持 C++11 的编译器才能编译,同时对几百个基础函数使用 “wide universal intrinsics” 重写,这些内联函数可以根据目标平台和编译选项映射为 SSE2、SSE4、AVX2、NEON 或者 VSX 内联函数,获得性能提升。此外,还加入了 QR code 的检测和识别,以及 Kinect Fusion algorithm,DNN 也在持续改善和扩充。
在 OpenCV 的发展过程中,不断有新的功能和技术被加入,为计算机视觉领域的研究和应用提供了强大的支持。
三、OpenCV 的主要功能
OpenCV 提供了广泛的功能,涵盖图像处理、特征提取、目标检测、运动分析等多个领域。
1. 图像处理
OpenCV 提供了丰富的图像处理功能,包括滤波、去噪、对比度增强、色彩调整、边缘检测等功能,为后续视觉分析提供基础。例如,可以使用高斯滤波器进行去噪处理,通过调整图像的对比度和色彩饱和度,使图像更加清晰和生动。边缘检测算法如 Canny 边缘检测,可以突出图像中的物体边缘,为后续的目标检测和特征提取提供重要线索。
2. 特征提取
OpenCV 提供了多种特征提取算法,如 SIFT、SURF、ORB 等,用于识别、跟踪和匹配图像中的关键点。这些算法对于目标检测、物体跟踪等任务具有重要意义。例如,SIFT 算法可以检测出图像中的尺度不变特征点,这些特征点在不同的尺度和旋转下具有不变性,非常适合用于图像匹配和目标识别。ORB 算法则是一种快速的特征提取算法,具有较高的实时性,适用于实时应用场景。
3. 目标检测
OpenCV 提供多种目标检测算法,可用于人脸识别、车辆检测、行人检测等实时任务。例如,Haar cascades 算法可以用于人脸检测,通过训练分类器,可以快速准确地检测出图像中的人脸。YOLO 和 SSD 等深度学习算法则可以实现更复杂的目标检测任务,如车辆检测和行人检测。这些算法大大提高了计算机视觉应用的实时性和准确性。
4. 运动分析
通过光流法、帧间差分法等算法,OpenCV 可以分析视频中的运动信息,应用于视频监控、手势识别等场景。光流法可以通过计算图像中像素的运动速度和方向,来分析物体的运动轨迹。帧间差分法则是通过比较相邻帧之间的差异,来检测视频中的运动物体。这些算法可以帮助我们理解和分析视频中的运动信息,为视频监控和手势识别等应用提供支持。
5. 人脸识别
OpenCV 包括人脸检测、人脸对齐、特征提取等功能,可用于安全监控、身份认证等领域。人脸检测可以快速准确地检测出图像中的人脸位置和大小。人脸对齐则可以将检测到的人脸进行归一化处理,使得不同角度和表情的人脸具有相同的姿态。特征提取可以提取出人脸的特征向量,用于人脸识别和身份认证。
6. 其他功能
OpenCV 还具有机器学习、深度学习、计算摄影、形态分析、文本检测和识别、表面匹配等功能。在机器学习方面,OpenCV 包含了多种机器学习算法,如 k 近邻、k 均值聚类、支持向量机、神经网络等,可以用于图像分类、目标识别等任务。深度学习方面,OpenCV 支持多种深度学习框架,如 Caffe、TensorFlow、Torch 等,可以实现更高级的图像识别、目标检测、图像分割等任务。计算摄影通过图像处理技术来改善相机拍摄的图像,如高动态范围成像、全景图像、图像补光等。形态分析可以识别图像中对象的形状、分析形状之间的相似性、转换对象形状等。文本检测和识别功能可以用于识别和检测图像中的文本,实现车牌识别、道路标志识别、内容数字化等相关应用。表面匹配模块提供了 3D 对象识别算法和 3D 特征的姿态估计算法,用于根据图像的深度和强度信息识别 3D 对象。
四、OpenCV 的应用场景
OpenCV 在多个领域有着广泛的应用,为实际问题提供了强大的解决方案。
1. 安全监控
OpenCV 在安全监控领域实现了运动检测、异常行为识别等功能。通过对视频流进行实时分析,可以检测到画面中的运动物体,并根据其运动轨迹和行为模式判断是否存在异常情况。例如,可以设置特定的区域,当有物体进入该区域时触发警报。同时,利用 OpenCV 的图像处理和特征提取功能,可以对人物的行为进行分析,如检测是否有人员徘徊、打斗等异常行为。
2. 医疗影像分析
OpenCV 在医疗影像分析方面发挥着重要作用,可用于肿瘤检测、病变分析等。通过对医学图像进行处理和分析,可以提取出关键的特征信息,帮助医生更准确地诊断病情。例如,利用图像增强技术可以提高图像的清晰度和对比度,使病变部位更加明显。同时,结合机器学习算法,可以对肿瘤等病变进行自动检测和分类,提高诊断效率和准确性。
3. 自动驾驶
在自动驾驶领域,OpenCV 进行障碍物检测、车道线识别等任务。通过对车载摄像头采集的图像和视频进行实时处理,可以检测到道路上的障碍物,如车辆、行人、障碍物等,并判断其距离和运动状态,为自动驾驶系统提供决策依据。同时,利用 OpenCV 的图像处理和特征提取功能,可以准确地识别车道线,确保车辆在行驶过程中保持在正确的车道内。
4. 增强现实 / 虚拟现实
OpenCV 在增强现实 / 虚拟现实领域实现了姿势估计、物体跟踪等功能。通过对摄像头采集的图像进行分析,可以实时估计用户的姿势和位置,为增强现实和虚拟现实应用提供交互基础。同时,利用物体跟踪技术,可以对特定的物体进行跟踪,实现更加丰富的交互体验。例如,在增强现实游戏中,可以跟踪用户的手部动作,实现虚拟物体的抓取和操作。
5. 无人机技术
OpenCV 在无人机技术中支持自主导航、目标追踪。通过对无人机搭载的摄像头采集的图像进行处理,可以实现对周围环境的感知和导航。例如,利用障碍物检测和地形识别技术,可以避免无人机与障碍物碰撞,并选择最佳的飞行路径。同时,利用目标追踪技术,可以对特定的目标进行跟踪,实现航拍、侦查等任务。
6. 机器人技术
OpenCV 为机器人视觉感知、定位和导航提供支持。通过对机器人搭载的摄像头采集的图像进行处理,可以实现对周围环境的感知和理解。例如,利用物体识别和场景理解技术,可以让机器人识别不同的物体和场景,并根据任务需求进行相应的操作。同时,结合定位和导航算法,可以让机器人在未知环境中自主定位和导航,完成各种任务。
7. 工业自动化
OpenCV 在工业自动化中进行质量控制、缺陷检测。通过对生产线上的产品进行图像采集和分析,可以检测出产品的缺陷和瑕疵,提高产品质量和生产效率。例如,利用图像检测技术可以检测产品的外观缺陷、尺寸偏差等问题,并及时发出警报进行处理。同时,结合机器学习算法,可以对产品进行分类和质量评估,为生产管理提供决策依据。
五、如何学习 OpenCV
OpenCV 作为一个强大的计算机视觉库,为初学者提供了丰富的学习资源和有效的学习途径。以下是一些学习 OpenCV 的方法和建议。
1. 安装 OpenCV
- 不同操作系统下的安装方法:
- Python 环境:在 Python 环境下安装 OpenCV 相对较为简单。可以通过 Python 的包管理器 pip
进行安装,在命令行中输入pip install opencv-python即可完成安装。安装完成后,就可以在 Python 程序中导入
OpenCV 库,并使用其中的函数和方法来进行图像处理和计算机视觉任务。
- Python 环境:在 Python 环境下安装 OpenCV 相对较为简单。可以通过 Python 的包管理器 pip
- C++ 环境:在 C++ 环境下安装 OpenCV 稍微复杂一些。可以从 OpenCV
官方网站下载适合自己操作系统的安装包,或者按照以下步骤进行安装:- 下载库文件:在 https://opencv.org/releases 网站根据需要(平台 / 版本号)下载适应于自己需要的 OpenCV
库(此为主源码库,包含了 OpenCV 的核心函数),选定安装路径后进行解压。从第 3 版本开始,OpenCV
分成了两个主要部分,若还需要使用最先进的算法,则需要在以上基础,在
https://github.com/opencv/opencv_contrib 上面再下载 contrib 包,并将其放进 opencv
库解压后的 source 文件夹下。 - 使用 cmake 工具安装库文件:在 https://cmake.org/download/ 网站下载你需要的 cmake 版本。编译
OpenCV 库,有两种编译方式:第一种是直接在命令行中运行 cmake;第二种是采用图形界面(cmake-gui),指定 OpenCV
源程序和二进制文件的路径,点击 Configure 并选择编译器,配置完成后再点击 Generate 即可。注意配置的时候一定要勾选
BUILD_opencv_world 模块和 OPENCV_ENABLE_NONFREE 模块。BUILD_opencv_world
模块将所有模块的库文件合并成一个大的库文件,在链接时候会方便一点;OPENCV_ENABLE_NONFREE 模块让你可以使用带专利的比如
SURF 角点之类的第三方模块中的功能。 - 安装 OpenCV 库:在 build 文件夹下双击打开生成的 OpenCV.sln 解决方案;选择 INSTALL
项目(CMakeTargets 下)并执行 build 指令(使用右键);编译完成后 build 目录下将自动创建 install
目录,OpenCV 库安装完成。该 install 目录下有关联到应用程序的 OpenCV
库的所有二进制文件,以及程序需要调用的动态库文件。 - 配置电脑的环境变量:点击电脑 —> 属性 —> 高级系统设置 —> 环境变量 —> 系统变量 —>Path;在 Path
路径下添加你的环境变量,如 F:\opencv
4.1.0\opencv-4.1.0-vc14_vc15\opencv\build\install\x64\vc15\bin。这里的 vc15 是因为我的 VS 版本是 2017,如果是 vs2015,则对应选择 vc14,VS2019 则对应选择 vc16。 - 在 Visual Studio 中创建工程,并对该工程进行环境配置:注意进行以下配置时,需保证 “解决方案配置” 和 “解决方案平台”
都保持一致,通常设置为 Debug 和 x64。- 添加包含目录:单击选中项目名称,依次选择项目 —> 属性 —>VC++ 目录 —> 包含目录 —> 编辑,添加你的包含目录,如
F:\opencv 4.1.0\build\install\include 和 F:\opencv
4.1.0\build\install\include\opencv2。如果安装的是 opencv3.X 版本,则还需要添加 F:\opencv 4.1.0\build\install\include\opencv。 - 添加库目录:依次选择项目 —> 属性 —> 链接器 —> 输入 —> 附加依赖项 —> 编辑,添加你的库目录,如 F:\opencv
4.1.0\build\install\x64\vc15\lib。 - 添加附加依赖项:依次选择项目 —> 属性 —> 链接器 —> 输入 —> 附加依赖项 —>
编辑,添加你所需的库文件名(在库目录下面)。如果在 cmake 重新编译的时候选择勾选 BUILD_opencv_world
模块,则通常添加 opencv_world410d.lib(debug 版本)或 opencv_world410.lib(realease
版本)就好了;如果没有选择勾选该模块,则里面有很多库文件,此时都要一一添加进去。
- 添加包含目录:单击选中项目名称,依次选择项目 —> 属性 —>VC++ 目录 —> 包含目录 —> 编辑,添加你的包含目录,如
- 下载库文件:在 https://opencv.org/releases 网站根据需要(平台 / 版本号)下载适应于自己需要的 OpenCV
- 可能出现的错误及解决方案:执行工程时提示找不到 opencv_world410.dll 文件,可以把自己 opencv 文件目录下的
\opencv\build\x64\vc15\bin 中的三个 dll 文件,拷贝到 C:\Windows\System32 中。
2. 学习编程语言
OpenCV 支持多种编程语言,选择一种熟悉的语言进行学习可以提高学习效率。
- Python:Python 是一种简单易学的高级编程语言,具有丰富的生态系统和大量的科学计算库。使用 Python 编写 OpenCV
程序更加方便快捷,适合快速原型开发和小规模项目。 - C++:C++ 是 OpenCV 的原生开发语言,因此提供了最为全面的功能支持。使用 C++ 进行 OpenCV 编程,可以充分利用
OpenCV 库的性能优势,特别是在处理高性能计算任务时。C++ 接口相对底层,提供了更多的灵活性和控制能力。 - Java:Java 是另一种支持 OpenCV 的编程语言,特别是在开发跨平台的桌面应用或 Android 移动应用时。Java 对
OpenCV 的支持通过 JNI(Java 本地接口)实现,允许直接访问 OpenCV 库中的功能。 - 其他语言:OpenCV 如今也提供对于 C#、Ch、Ruby 的支持。这些语言的 API 接口函数可以通过在线文档获得。一个使用 CUDA
的 GPU 接口也于 2010 年 9 月开始实现。
3. 学习基础知识
了解图像和视频处理、图像转换和滤波器等 OpenCV 基础知识是学习 OpenCV 的重要步骤。
- 图像与矩阵:一般来说,图像是一个标准的矩形,有着宽度(width)和高度(height)。而矩阵有着行(row)和列(column),矩阵的操作在数学和计算机中的处理都很常见且成熟,于是很自然的就把图像作为一个矩阵,把对图像的操作转换成对矩阵的操作,实际上所有的图像处理工具都是这么做的。计算机视觉中的图像是数字设备捕获到物理世界的表象。图像只是存储在矩阵格式中的数字序列。每个数字是一个考虑的波长(例如
RGB
图像中的红、绿、蓝)或波长范围(对全色设备而言,如红外光谱仪)的光强衡量。图像中的每个点称为像素,每个像素可以存储一个或多个值。这取决与它的灰度。这些值存储只有一个值,例如
0 或者 1. 灰度级尺寸可以存储一个值,彩色图像可以存储 3 个值。 - OpenCV 的 mat 类:OpenCV 最初是 Intel 在俄罗斯的团队实现的,而在后期 Intel 对 OpenCV
的支持力度慢慢变小。在 08 年,美国一家机器人公司 Willow Garage 开始大力支持 OpenCV,在得到支持后 OpenCV
更新速度明显加快,加入了很多新特性。在 OpenCV1.x 时代,数据类型为
IplImage,在使用这种数据类型时,考虑内存管理称为众多开发者的噩梦。在进入到 OpenCV2.x 时代,一种新的数据类型 Mat
被定义,将开发者极大的解脱出来。所以在接下来的教程中,都会使用 Mat 类,而在看到 IplImage 类数据时也不要感到奇怪。Mat
类有两种基本的数据结构组成,一种是矩阵头(包括矩阵尺寸、存储方法、存储路径等信息),另一个是指向包含像素值的矩阵的指针(矩阵维度取决于其存储方法)。矩阵头的尺寸是个常数,但是矩阵自身的尺寸根据图像不同而不同。
4. 练习实际应用
通过实际项目,如人脸识别、物体检测等,掌握 OpenCV 的使用。
- 实际项目举例:
- 人脸识别:使用 OpenCV 实现人脸检测和识别,广泛应用于门禁系统、安全监控等领域。通过 Haar
级联检测器或深度学习技术,可以快速准确地检测出人脸并进行识别。 - 物体检测和跟踪:在智能视频监控中,可以使用 OpenCV 进行物体检测和跟踪。例如,在自动驾驶领域,OpenCV
可以通过对车辆周围环境进行实时图像与视频分析,帮助汽车判断道路情况、障碍物等,从而保证行车安全。
- 人脸识别:使用 OpenCV 实现人脸检测和识别,广泛应用于门禁系统、安全监控等领域。通过 Haar
5. 参与社区
加入 OpenCV 社区,与其他开发者交流学习。
- OpenCV 社区资源:
- OpenCV 研习社:社区数位资深 OpenCV 开发高手负责答疑解惑,免费项目技术咨询。社区包括 OpenCV4 系统化课程 140
课时、Tensorflow 基础课程 27 课时、OpenCV 经典案例代码 400 篇、CV
方向论文资料等精华内容。从零基础开始认真学习,掌握 OpenCV 开发技术,成为合格的 OpenCV
开发者!加入之后课程问题与其它技术咨询可以直接向星主与嘉宾提问得到解答。 - CSDN 社区云 OpenCV 社区:OpenCV 相关技术交流专区,用户可以在这里提问、分享经验和解决问题。
- OpenCV 官方论坛:OpenCV 的官方网站提供了一个论坛,开发者可以在这里交流学习、寻求帮助、分享项目和经验。
- OpenCV 研习社:社区数位资深 OpenCV 开发高手负责答疑解惑,免费项目技术咨询。社区包括 OpenCV4 系统化课程 140
通过以上方法,初学者可以逐步掌握 OpenCV 的使用,为进一步深入学习计算机视觉打下坚实的基础。
相关文章:
《OpenCV:视觉世界的魔法钥匙》
《OpenCV:视觉世界的魔法钥匙》 一、OpenCV 是什么1. 起源与发展支持2. 特点与优势3. 编程语言支持 二、OpenCV 的发展历程1. 重要版本发布时间线2. 版本更新内容 三、OpenCV 的主要功能1. 图像处理2. 特征提取3. 目标检测4. 运动分析5. 人脸识别6. 其他功能 四、Op…...
Day7 苍穹外卖项目 缓存菜品、SpringCache框架、缓存套餐、添加购物车、查看购物车、清空购物车
目录 1.缓存菜品 1.1 问题说明 1.2 实现思路 1.3 代码开发 1.3.1 加入缓存 1.3.2 清除缓存 1.3.2.1 新增菜品优化 1.3.2.2 菜品批量删除优化 1.3.2.3 修改菜品优化 1.3.2.4 菜品起售停售优化 1.4 功能测试 1.4.1 加入缓存 1.4.2 菜品修改 1.5 代码提交 2.缓存套餐 2.1 Spring C…...
华为路由策略和策略路由学习笔记
控制网络流量可达性 思考:如何控制网络流量可达性? 解决方案一:可通过修改路由条目(即对接收和发布的路由进行过滤)来控制流量可达性,这种方式称为路由策略。 解决方案二:可直接通过依据用户制定的策略进行转发,且该策略优于路由…...
网上图书购物管理系统|Java|SSM|VUE| 前后端分离
【一】可以提供远程部署安装,包扩环境 【二】提供软件相关的安装包 【三】如果需要提供java入门资料可咨询 【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、M…...
杂发单的单据类型一个参数的逻辑
【核准中可改】被产线滥用了。它们可以这样做,开立一张杂发单,打印出来交领导层签名。单据要交财务做核算的。然后去修改杂发单的材料。以为可以瞒天过海。2个仓库,一个中掉坑里,一个发现了它们的拙劣的手段,上报之后没…...
AUTOSAR CP中基于通信模块(COM)的Transformer-R24的规范导读
该文档是关于 AUTOSAR CP中基于通信模块(COM)的Transformer的规范说明,主要内容包括引言、相关文档、约束与假设、功能规范、API 规范、配置规范等,旨在为汽车电子系统开发中基于 COM 的Transformer提供全面的技术规范和指导。 一…...
yarn : 无法加载文件 C:\Users\L\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁
关于执行安装yarn命令后执行yarn -v报错: 先确认执行安装yarn命令是否有误 # 安装yarn npm install yarn -g 终端输入set-ExecutionPolicy RemoteSigned 当然如果yarn -v仍然执行失败,考虑使用管理员方式运行IDEA, 注:如上操作…...
证明直纹面是可展曲面沿着直母线,曲面的切平面不变
目录 证明直纹面是可展曲面的当且仅当沿着直母线,曲面的切平面不变 证明直纹面是可展曲面的当且仅当沿着直母线,曲面的切平面不变 直纹面是可展曲面当且仅当沿着直母线,曲面的切平面不变. 证明:设直纹面 S S S的参数式为 r ( u …...
一种将png图像批量转换为RGB格式的方法
1.前言 大家在做2D图像分类的时候,代码经常要求图像是RGB格式。有时候我们的图像并不是RGB,尤其是处理病理图像切分的pach的时候,这时候就需要批量进行格式转换了。好了,直接上代码: import os from PIL import Image…...
Python 中的继承机制是什么样的?
Python的继承机制允许一个类(子类)继承另一个类(父类或基类)的属性和方法。 通过继承,可以实现代码复用,同时也能让代码结构更加清晰、易于维护。 Python支持单继承和多继承,并且有丰富的特性…...
MyBatis注解开发(一)
目录 使用注解完成CRUD 1. SqlMapConfig.xml配置文件 2. UserDao接口方法和注解的编写 3. UserTest测试方法的编写 注解方式比较简单,但是实际开发不推荐使用注解,使用配置文件的方式,不需要改源代码。 Insert:添加 Update:修改 Delete:删…...
挑战用React封装100个组件【010】
Hello,大家好,今天我挑战的组件是这样的! 今天这个组件是一个打卡成功,或者获得徽章后的组件。点击按钮后,会弹出礼花。项目中的勋章是我通过AI生成的,还是很厉害的哈!稍微抠图直接使用。最后面…...
深入浅出:Go语言中的错误处理
深入浅出:Go语言中的错误处理 引言 在任何编程语言中,错误处理都是一个至关重要的方面。它不仅影响程序的稳定性和可靠性,还决定了用户体验的质量。Go语言以其简洁明了的语法和强大的并发模型而著称,但其错误处理机制同样值得关…...
Spire.doc 合并word,复制word
之前使用的poi来实现这个功能,然后发现在复制chart时,边框样式无法修改,于是就使用了spire.doc 1. 引入依赖 <repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https…...
《Java核心技术I》线程局部变量
线程局部变量 ThreadLocal辅助类为各个线程提供各自的实例。 public static final THreadLocal dateFormat ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd")); 要访问具体的格式化方法,可以调用: String dateStamp d…...
C++实现排序算法:冒泡排序
目录 前言 冒泡排序性质 C代码实现冒泡排序 冒泡图解 第一趟排序 第二趟排序 第三趟排序 排序结果 结语 前言 冒泡排序的基本思想是通过从前往后(从后往前)两两比较,若为逆序(即arr[i] < arr[i 1])则交换…...
智慧银行反欺诈大数据管控平台方案(八)
智慧银行反欺诈大数据管控平台的核心理念,在于通过整合先进的大数据技术、算法模型和人工智能技术,构建一个全面、智能、动态的反欺诈管理框架,以实现对金融交易的全方位监控、欺诈行为的精准识别和高效处理。这一理念强调数据驱动决策&#…...
阿里云通义千问:全面解析智能云服务先锋
一、技术架构与基础 模型构建基石 采用大规模语料库训练,涵盖多领域知识,如科学、历史、文学等,确保知识储备丰富多样。运用先进的神经网络架构,深度优化模型结构,提高信息处理效率与准确性。持续的语料更新机制&…...
Qt 设置QLineEdit控件placeholderText颜色
Qt 会根据QLineEdit控件显示文本的颜色自动设置placeholderText颜色,如果想自定义placeholderText颜色,可以通过以下方法。 在样式文件中增加以下设置: QLineEdit#lineEdit_userName, QLineEdit#lineEdit_password{border: none;padding: 6…...
opencv光流法推测物体的运动
光流法是计算机视觉中的一种技术,用于估计图像中相邻帧之间的像素位移或运动。它是一种用于追踪图像中物体运动的技术,可以在视频中检测并测量物体的运动轨迹。基本上,光流意味着计算像素的移动向量作为物体在两个相邻图像之间的位移差。光流…...
Vue指令(一)--v-html、v-show、v-if、v-else、v-else-if、v-on、v-bind、v-for、v-model
目录 (一)初识指令和内容渲染指令v-html 1.v-html 案例: 官网的API文档 (二)条件渲染指令v-show和v-if 1. v-show 2. v-if (三)条件渲染指令v-else和v-else-if 案例 (四…...
Elixir GenServer
GenServer 是一个用来实现客户端-服务器模式中服务器的行为模块。 GenServer 是一个普通的 Elixir 进程,同其他 Elixir 进程一样,它可以用来保存状态、异步执行代码等。使用这个模块来实现通用服务器进程(GenServer)的优势在于&a…...
第八节、Bresenham直线插补【51单片机-TB6600驱动器-步进电机教程】
摘要:前面章节主要介绍单个电机控制,本节内容介绍两个电机完成直线插补运动 一、 Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发,最初用于计算机显示直线,它确定应该选择的n维光栅的点&#…...
JDK1.8
JDK1.8 1. Lamdba表达式 Lambda表达式是什么? Lambda是一个匿名函数,我们可以将Lambda表达式理解为一段可以传递的代码(将代码像数据一样传递)。使用它可以写出简洁、灵活的代码。作为一种更紧凑的代码风格,使java语…...
【jvm】讲讲jvm中的gc
目录 1. 说明2. 主要算法2.1 标记-清除算法2.2 复制算法2.3 标记-整理算法3. 主要回收器3.1 Serial GC3.2 Parallel GC3.3 CMS(Concurrent Mark-Sweep)GC3.4 G1(Garbage-First)GC 4. 触发条件4.1 Minor GC(Young GC&am…...
Oracle 用户管理模式下的恢复案例-不完全恢复
1. 不完全恢复的几种常用方法 01. recover database using backup controlfile 如果丢失当前控制文件,用冷备份的控制文件恢复的时候,用来告诉 oracle,不要以 controlfile 中的 scn 作为恢复的终点; 02. recover database until …...
Leetcode经典题4--查找数组中的多数元素+Boyer-Moore 投票算法
题目描述: 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 输入输出示例 输入:nums [2,2,1,1,1,2,2] 输出…...
ubuntu20.04 如何使用 perf 性能分析工具 以及 hotspot 性能分析可视化工具?
官方文档:https://perfwiki.github.io/main/ 如何安装:https://askubuntu.com/questions/50145/how-to-install-perf-monitoring-tool 首先是安装 perf: sudo apt-get install linux-tools-common sudo apt-get install linux-tools-generic sudo apt-…...
Scala-隐式转换
系统自动完成的:把一种类型的数据转成了另一种类型的数据。 不是所有的类型都可以执行隐式转换 函数的参数类型 和 返回值类型是重要的,它约定了把什么类型转成什么类型 //张三的函数def getAge():Double{8.5}//函数名:tranform 不重要//函…...
基于Java和Vue开发的漫画阅读软件漫画阅读小程序漫画APP
前景分析 受众广泛:漫画的受众群体广泛,不仅限于青少年,还涵盖了成年人等多个年龄层和社会阶层。漫画文化在全球范围内的影响力不断扩大,未来漫画软件创业可以考虑全球市场的拓展。 市场需求大:数字化阅读趋势下&…...
租赁小程序的优势与应用场景解析
内容概要 租赁小程序,听起来是不是很酷?其实,它就是一个让你可以方便地租借各种高成本但用得不频繁的商品的平台。想象一下,当你需要租一件派对用的华丽小礼服,或是想体验一下超酷的运动器材,租赁小程序就…...
CC-Link IEFB转Modbus TCP协议网关(技术分享)
一,设备主要功能 捷米特JM-CCLKIE-TCP网关实现连接到CC-Link IE Field Basic总线中做为从站使用,连接到Modbus TCP总线中做为主站或从站使用。 应用广泛:捷米特JM-CCLKIE-TCP广泛应用于支持Modbus TCP接口的上位机、变频器、仪表、马保等等…...
开发手札:Win+Mac下工程多开联调
最近完成一个Windows/Android/IOS三端多人网络协同项目V1.0版本,进入测试流程了。为了方便自测,需要用unity将一个工程打开多次,分别是Win/IOS/Android版本,进行多角色联调。 在Win开发机上,以Windows版本为主版…...
SSM报错:表现层方法应该返回字符串,但是返回页面
在进行SSM项目时,后端表现层应该返回给前端字符串,但是却跳转页面 1.首先检查是否使用ResponseBody注解 ResponseBody注解 作用:将java对象转为json格式的数据。将controller的方法返回的对象通过适当的转换器转换为指定的格式之后࿰…...
Unity中使用Sqlite存储本地数据
sqlite-net sqlite下载页 我的环境:win11、unity团结1.3.4 1.下载sqlite-net,将SQLite.cs脚本导入Unity 2.下载各平台依赖项,如dll、aar等。导入Unity并设置 3.简单列子,打包测试 using System; using System.IO; using SQLi…...
微信直连:商户转账到零钱API开发报错:java.security.InvalidKeyException: Illegal key size
jdk版本 解决方案:下载jce_policy-8,替换jre下的 local_policy.jar 文件 替换jdk内的jre下的 替换jre下的 JDK 8u161 之后默认使用了不限制的Policy...
语言处理程序基础
逻辑运算 正规式 有限自动机 上下文无关文法 表达式(前缀、后缀、中缀) 将表达式(a-b)*(c5)构造成树的步骤为:括号不能出现在树中;按照表达式的计算顺序来依次构造!&…...
deepsort复现报错TypeError: tuple indices must be integers or slices, not tuple 解决
deepsort复现中遇到的TypeError: tuple indices must be integers or slices, not tuple问题的解决-CSDN博客 以上为参考教程。 复现的时候出现这个报错,搞了好久试了好多方法,包括降 scikit-learn版本,都不行,最后终于找到这个博…...
「Mac畅玩鸿蒙与硬件42」UI互动应用篇19 - 数字键盘应用
本篇将带你实现一个数字键盘应用,支持用户通过点击数字键输入数字并实时更新显示内容。我们将展示如何使用按钮组件和状态管理来实现一个简洁且实用的数字键盘。 关键词 UI互动应用数字键盘按钮组件状态管理用户交互 一、功能说明 数字键盘应用将实现以下功能&…...
MSSQL SQLi Labs靶场 第一关 (手工版)
一.判断是否存在注入 输入http://172.16.0.87/less-1.asp?id1页面异常 加上闭合点:http://172.16.0.87/less-1.asp?id1--页面正常,说明存在注入 二.判断数据库类型 可通过以下Payload来探测当前站点是否是MSSQL数据库,正常执⾏说明后台数据…...
重磅更新:CnosDB 2.3.5.4 版本上线, 性能提升,问题修复一网打尽
📢 重磅更新:CnosDB 2.3.5.4 版本上线, 性能提升,问题修复一网打尽 📢 我们很高兴地向大家介绍最新版本的更新,以下是本次更新的主要内容: 🔹 版本号:2.3.5.4 🔹 发布…...
后端-编辑按钮的实现
编辑一共要实现两步: 1.点击编辑蹦出来一个弹窗,此时需要回显,根据id查出来这条数据 2.修改某些值之后点击保存的时候调用修改的接口 根据id查询的时候正常操作 修改值的时候要注意一些问题 mapper层的Employee和impl层的接收实体不一样...
Python语言基础入门教程
Python是一种简单易学、功能强大的编程语言,非常适合初学者入门。本篇博客将带你从零开始,学习Python的一些基础知识,并通过详细分析和实例帮助你理解。 一、什么是Python? Python是一种高级编程语言,具有以下特点&am…...
verilog编程规范
verilog编程规范 文章目录 verilog编程规范前言一、代码划分二、verilog编码ABCDEFG 前言 高内聚,低耦合,干净清爽的代码 一、代码划分 高内聚: 一个功能一个模块干净的接口提取公共的代码 低耦合: 模块之间低耦合尽量用少量…...
Spring Boot 的启动原理
Spring Boot 是由 Pivotal 团队发布的一个开源框架,它基于 Spring 框架,旨在简化企业级应用程序的开发过程。与传统的 Spring 项目相比,Spring Boot 提供了一种更加简洁、高效的方式来构建和部署应用程序。其核心理念是“约定优于配置”和“自…...
Oracle 19C RU补丁升级,从19.7to19.25 -单机
1. 环境信息: 角色 数据库 IP地址 数据库版本 数据库名称 源端 单实例 172.30.21.191 19.7 hfzcdb 2. 安装准备 用rman备份数据库,再备份下oracle目录: 命令: tar zavf oracle.tar /oracle 19.25版本关于19C的补丁内…...
Web day08 项目实战(2)
目录 查询员工: 在EmpController层: 在pojo层: 在EmpServiceImpl 层中: 在dao层: 新增员工: pojo层: EmpController层: 在EmpServiceImpl 层中: 在EmpMapper层: …...
生命周期(vue2和vue3的生命周期对比)有哪些?
Vue.js 提供了一套完整的数据驱动和组件化思想,其生命周期钩子是开发者理解组件行为的关键。以下是 Vue 2 和 Vue 3 中生命周期钩子的对比: Vue 2 生命周期钩子 创建阶段 beforeCreate:实例初始化之前调用,此时 data 和 methods …...
智慧信息发系统——控件磁吸
//鍙悜涓婂惛 function fun_鎺т欢纾佸惛_璁$畻(鐏典綋y,寮曞姏鍊�,閫夋嫨鍖哄煙,璁$畻鍧愭爣绫诲瀷) {const 灞忓箷椤圭洰 document.querySelectorAll(閫夋嫨鍖哄煙);var 璺濈鎴戞渶杩憏 0;var 鏈€杩戜竴娆″紩鍔� 0…...
【时间序列预测】基于PyTorch实现CNN_LSTM算法
文章目录 1. CNN_LSTM模型概述2. 网络结构3. 完整代码实现4.模型解析4.1 CNN层4.2 ReLU层4.3 MaxPooling层4.4 LSTM层4.5 输出层4.6 前向传播 5. 总结 在时间序列预测任务中,CNN(卷积神经网络)和LSTM(长短期记忆网络)是…...