简介

  • OpenCV 相关理论基础知识笔记

cmake 编译安装

  • cmake -DCMAKE_INSTALL_PREFIX=/home/user/zjy-190/Documents/OpenCV/4.5.2/install -DCMAKE_TYPE=RELEASE -DWITH_FFMPEG=OFF -DOPENCV_EXTRA_MODULES_PATH=/mnt/remote/190-mnt/zhangjunyi/Documents/OpenCV/4.5.2/opencv-4.5.2/modules ..
  • 参数:
    • CMAKE_INSTALL_PREFIX : 设置安装路径
    • CMAKE_TYPE : 设置编译类型
    • WITH_FFMPEG : 设置是否带有ffmpeg,因为ffmpeg版本不对应,安装会失败,所以关掉了
    • OPENCV_EXTRA_MODULES_PATH : 设置OpenCV扩展模块路径 opencv_contrib

安装opencv

  • 安装依赖环境
    1
    2
    3
    
      sudo apt-get install build-essential
      sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev 
      sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
    
    • 找不到 libjasper-dev
      1
      2
      3
      
      sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
      sudo apt update
      sudo apt install libjasper1 libjasper-dev
      
  • 下载源码,解压缩,创建build文件夹
    1. ` cmake -D CMAKE_INSTALL_PREFIX=/usr/local CMAKE_BUILD_TYPE=Release OPENCV_GENERATE_PKGCONFIG=ON OPENCV_ENABLE_NONFREE=True .. `
    2. ` sudo make -j6 `
    3. ` sudo make install`
  • 环境配置
    • 修改/etc/bash.bashrc,增加内容:
      1
      2
      
      PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
      export PKG_CONFIG_PATH
      
    • 更新: ` sudo updatedb && source /etc/bash.bashrc `
    • 修改动态库 /etc/ld.so.conf.d/opencv.conf (如果没有,就创建) /usr/local/lib
    • 更新: sudo ldconfig

OpenCV概念

  • 图像处理(Image Processing)是用计算机对图像进行分析,以达到所需要的结果的技术,又称影像处理。

  • 图像处理技术一般包括:图像压缩,增强和复原,匹配,描述和时别。
  • 图像处理一般指数字图像处理(Digital Image Processing)。其中,数字图像是指工业相机,摄像机,扫描仪等设备经过拍摄得到的一个大的二维数组。该数组的元素称为像素,其值称为灰度值。而数字图像处理是通过计算机对图像进行去除噪声,增强,复原,分割,提取特征等处理的方法和技术。

OpenCV整体架构

  • /usr/local/include/opencv4/opencv2目录下的opencv_modules.hpp的文件中,存放OpenCV中与新模块构造相关的说明代码,打开可以发现其定义的是OpenCV所有组件的宏
  • 官方文档:https://docs.opencv.org/4.x/

  • OpenCV 提供的是C++ API,
  • C API在OpenCV 2.4 版本之后就被弃用了

calib3d

  • Calibration(校准)3D这两个词的组合缩写。
  • 这个模块主要是相机校准和三维重建相关的内容,包括基本的多视觉几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等。

core

  • 核心功能模块
  • 包含内容:
    • OpenCV基本数据结构
    • 动态数据结构
    • 绘图函数
    • 数组操作相关函数
    • 辅助功能与系统函数和宏
    • OpenGL的交互操作

features2d

  • 2D Features Framework

  • 人类视觉系统倾向于从给定场景中提取主要特征,然后记住它,这样便于后续的检索。为了模仿这一点,人们开始设计各种特征提取器,用于从给定的图像中提取出这些特征点
  • 流行的算法包括尺度不变特征变换(Scale Invariant Feature Transform, 简称SIFT),加速鲁棒特征(Speeded Up Robust Features, 简称SURF)和加速分段测试特征(Features From Accelerated Segment Test, 简称FAST)

  • Features2D,即2D功能框架,包含如下内容:
    • 特征检测和描述
    • 特征检测器通用接口(Feature Detectors)
    • 描述符提取器通用接口(Descriptor Extractors)
    • 描述符匹配器通用接口(Descriptor Matchers)
    • 通用描述符匹配器通用接口(Generic Descriptor)
    • 关键点描绘函数和匹配功能绘制函数

flann

  • Clustering and Search in Multi-Dimensional Spaces

  • Fast Library for Approximate Nearest Neighbors, 高维的近似近邻快速搜索算法库,包含:快速近似最近邻搜索和聚类

highgui

  • 高层GUI图形用户界面,可用于处理所有高级用户界面操作,包含媒体的输入输出,视频捕捉,图像和视频的编码解码,图形交互界面的接口等内容
  • 它有一个等待功能,可以等按下键盘上的一个键才进行下一步,还有一个可以检测鼠标事件的功能,在开发交互式应用程序时非常有用

接口

  • 地址:https://docs.opencv.org/4.x/d4/dd5/highgui_8hpp.html

  • 功能:Displays an image in the specified window
  • 原型:void cv::imshow(const String &winname, InputArray mat);

  • 功能:Creates a window
  • 原型:void cv::nameWindow(const String &winname, int flags=WINDOW_AUTOSIZE);

imgcodecs

  • Image file reading and writing

接口

  • 功能:Loads an image from a file
  • 原型:Mat cv::imread(const String &filename, int flags=IMREAD_COLOR);

  • 功能:Saves an image to a specified file
  • 原型:cv::imwrite(const String &filename, InputArray img, const std::vector<int> &params=std::vector<int>())'

imgproc

  • Image Processing

  • ImageProcess这两个单词的缩写组合,图像处理模块
  • 包含如下内容:
    • 线性和非线性的图像滤波
    • 图像的几何变换
    • 其他图像转换
    • 直方图相关
    • 结构分析和形状描述
    • 运动分析和对象跟踪
    • 特征检测
    • 目标检测等内容
  • 可以执行诸如图像过滤,形态学操作,几何变换,颜色转换,图像绘制,直方图,形状分析,运动分析,特征检测等操作

ml

  • Machine Learning, 机器学习模块,基本上是统计模型和分类算法
  • 包含如下内容:
    • 统计模型(Statistical Models)
    • 一般贝叶斯分类器(Normal Bayes Classifier)
    • K-近邻(K-Nearest Neighbors)
    • 支持向量机(Support V)

videoio

  • Video I/O, 视频输入和输出

  • 用到的对象
    • cv::VideoCapture
  • 需要链接的库文件:
    • libopencv_videoio.so

video

  • Video Analysis,视频分析

stitching

  • Images stitching

objdetect

  • Object Detection, 目标检测

photo

  • Computational Phtotgraphy

dnn

  • Deep Neural Network module, 深度神经网络模块

gapi

  • Graph API

链接库顺序

在使用 OpenCV 动态库时,需要按照正确的顺序链接库文件以确保编译器能够正确解析符号(symbols)并建立正确的依赖关系。下面是一般情况下建议的 OpenCV 动态库链接顺序:

  1. 链接 OpenCV 核心库:opencv_core 这是 OpenCV 库的核心组件,提供了图像处理和数据结构的基本功能。在链接时,应首先链接这个核心库。

  2. 链接 OpenCV 模块库: OpenCV 包含了许多模块,如图像 I/O、图像处理、特征检测、目标跟踪等。根据你的需要,链接所需的模块库,例如 opencv_imgprocopencv_highguiopencv_objdetect 等。

  3. 链接其他依赖库: OpenCV 有时会依赖其他第三方库,如图像编解码库(如 libjpeg、libpng)和矩阵操作库(如 Eigen)。如果你使用了这些功能或模块,需要链接这些依赖库。

链接顺序的目的是确保编译器能够按照正确的顺序解析符号并建立正确的依赖关系。在编译器搜索符号时,它会按照链接顺序从左到右查找库文件中的符号。因此,如果一个库依赖于另一个库,后者应该在前者的链接顺序中出现。

请注意,具体的链接顺序可能因操作系统和编译器而异。因此,建议参考 OpenCV 官方文档或相关文档,以获得特定平台和编译环境下正确的链接顺序。

以下是一个示例的编译命令,展示了如何在 C++ 项目中正确链接 OpenCV 动态库:

1
2
3
4
5
g++ main.cpp -o main \
  -lopencv_core \
  -lopencv_imgproc \
  -lopencv_highgui \
  -ljpeg -lpng -lz

在上述示例中,-lopencv_core-lopencv_imgproc-lopencv_highgui 是链接 OpenCV 核心库和模块库的选项。-ljpeg-lpng-lz 是链接其他依赖库的选项。

请根据你的具体需求和所使用的 OpenCV 模块,适当调整链接选项和顺序。

OpenCV 模块库

OpenCV 4.5.2 包含了许多模块库,每个模块库提供了不同的功能和算法。下面是对一些常用的 OpenCV 4.5.2 模块库进行简要的详解:

  1. opencv_core
    • 核心组件,提供了图像处理和数据结构的基本功能,如矩阵操作、数组操作、像素访问等。
  2. opencv_imgproc
    • 图像处理模块,提供了丰富的图像处理算法和功能,如图像滤波、边缘检测、形态学操作、直方图均衡化等。
  3. opencv_highgui
    • 用户界面模块,用于显示图像和处理用户输入,提供了图像显示、窗口管理、鼠标和键盘事件处理等功能。
  4. opencv_video
    • 视频分析模块,包含了视频处理和分析的算法和功能,如光流估计、背景建模、物体跟踪等。
  5. opencv_videoio
    • 视频输入输出模块,用于读取和写入视频文件,支持多种视频格式和编解码器。
  6. opencv_objdetect
    • 目标检测模块,提供了训练和使用目标检测器的功能,包括人脸检测、物体检测等。
  7. opencv_features2d
    • 特征检测和描述子模块,提供了各种特征检测算法和描述子提取方法,如关键点检测、特征匹配等。
  8. opencv_calib3d
    • 相机标定和三维重构模块,包含了相机标定、立体视觉、三维重建等相关算法和功能。
  9. opencv_ml
    • 机器学习模块,提供了常见的机器学习算法和工具,如分类、回归、聚类等。
  10. opencv_dnn
    • 深度学习推理模块,支持使用深度学习模型进行图像分类、目标检测、语义分割等任务。
  11. opencv_imgcodecs
    • 图像编解码模块,支持图像的读取和保存,以及常见图像格式的编码和解码。
  12. opencv_shape
    • 形状描述模块,提供了形状匹配和描述子计算等功能,适用于物体识别和形状分析。

以上只是 OpenCV 4.5.2 中的一些常用模块库的简要介绍,OpenCV 还包含了其他模块库,如图像分割、图像拼接、光学字符识别等。你可以参考 OpenCV 官方文

档以获取关于每个模块库的更详细信息和使用示例。

OpenCV和YOLO是什么样的关系

  • OpenCV,全名Open Source Computer Vision,是一个跨平台的计算机视觉库,它包含了大量的图像处理和计算机视觉方面的算法,被广泛应用于实时图像处理、机器学习、机器人视觉等领域。
  • YOLO,全名You Only Look Once,是一种深度学习的对象检测算法。它的特点是只需要一次前向传播就可以预测出图像中的对象以及它们的位置,因此在实时性和准确性之间取得了良好的平衡,被广泛应用于车辆检测、人脸识别等任务。

  • OpenCV和YOLO在许多计算机视觉任务中可以结合使用,形成一个完整的图像识别系统。在这样的系统中,OpenCV主要负责图像的获取、预处理和结果的可视化,YOLO则负责对处理过的图像进行深度学习对象检测。