计算机视觉基础知识介绍 Computer Vision
作者:禅与计算机程序设计艺术
1.简介
1.1 图像(Image)的基础知识
什么是图像?
image(Image)是一种在计算机中用像素点阵列或矩阵形式表示光电信号分布的技术手段。它既可以表示静态信息也可以表示动态信息并且还可以扩展到三维空间来描述复杂的视觉现象。基于光电信号的不同特性每种颜色和纹理都有其独特的感知特性。受环境光线条件等因素的影响而表现出差异性。通常采用二进制编码其中每个像素值取0或1分别代表黑色或白色状态。然而在现实中大多数图片如彩色图高动态范围图透视变换图伽马校正值等都采用非二进制编码方案以更好地反映真实世界的复杂细节与色彩关系
什么是像素点?
像一个微小的矩形区域一样 Pixel 具有独特的色彩特征
图像的几何变换
在计算机视觉的过程中, 通常会进行各种几何转换操作, 包括缩放、旋转、位移和裁剪等技术手段。对于同一幅图片而言, 不同区域所使用的坐标系也会有所差异。以下是一些常见几何变换的具体定义: 尺度调整是指通过改变图像的像素间距来实现大小变化; 按照特定角度围绕某一点执行的转动操作被称为旋转; 在水平或垂直方向上移动一定像素距离的操作即为平移; 而截取所需显示区域的技术则统称为裁剪操作。
缩放(Scaling)
缩放操作通常会调整图像尺寸,并具体来说这通常包括两种主要方式:一种是根据图片的长宽比例进行调整从而达到缩放效果另一种则是直接指定目标尺寸这两种方法各有其适用场景能够满足不同的需求
旋转(Rotation)
旋转定义为将图像围绕某根轴进行转动的操作。按照顺时针方向测量的角度值被视为正数;而逆时针转动所得的角度值被视为负数。
平移(Translation)
平移指的是将图像沿着某一特定方向进行移动的操作方式,在实际应用中常用于实现图像对齐、背景去除以及物体分割等功能。在几何变换中,平移操作的方向通常与旋转轴保持垂直关系。
裁剪(Cropping)
也就是说,在处理原始图像时, 我们截取并分离出我们感兴趣的区域, 并去除不必要的部分. 在实际操作中, 默认情况下会进行一次完整的自动trim操作. 常用的自动trim方法包括矩形选择框, 椭圆选择工具以及圆形选择框等.
RGB色彩模型
在计算机视觉领域中广泛使用的颜色模型包括RGB、HSV以及CMYK等。其中一种常见的颜色模型是RGB, 它由红(Red)、绿(Green)和蓝(Blue)三种基本色组成。该种颜色编码方案直观且易于理解, 虽然如此, 它仍是应用中最常见的一种方案。通过将红(Red)、绿(Green)和蓝(Blue)三种基色按比例混合而得到图像中的每一点
彩色图像
彩色图像是指由不同颜色的像素点组合而成的画面。
某些图片甚至能够同时呈现多种色彩。
在表示色彩时常用的标准 RGB 模型中,
每个像素单元都包含对应的红、绿、蓝分量数值。
1.2 目标检测(Object Detection)
目标检测任务旨在识别并确定物体在图像中的位置及其类别。基于输入的图像数据,目标检测系统需输出所有被检测到的目标对象的位置信息及其分类结果。通常情况下,在完成目标检测的整体框架后,则会依次处理两个关键子任务:首先是分类问题的求解;其次是回归问题的具体实施步骤。最后将通过详细阐述这两个主要环节的具体实现过程及技术原理来完成整个系统的功能构建。
目标分类(Classification)
目标识别旨在判定图像中是否存在特定物体并归类。主要采用的方法包括基于模板匹配算法、卷积神经网络模型以及支持向量机(SVM)等多种技术。需要注意的是,在实际应用场景中,默认情况下这类模型一般可分为静态与动态两大类。其中一种类型基于固定训练数据集构建静态模型;另一种则利用在线学习机制实现动态调整。
目标回归(Regression)
目标回归的主要任务是识别物体的边界框(Bounding Box)及其所属类别。通过已知边界框和分类信息,我们可以估算出物体的几何形状和姿态特征。常见的目标回归方法包括基于锚定点靶标、基于密集采样器的方法以及分支网络驱动的回归技术。作为基础的技术手段,在目标检测任务中,锚点式回归方法通过利用正样本与负样本的学习机制实现了对缩放和平移不变性的有效处理。
1.3 图像配准(Camera Pose Estimation)
图像配准的任务主要通过已知目标的姿态与相机标定参数来实现相应的空间变换关系确定。确定摄像机参数的过程可视为机器人运动学中的一个关键辅助环节。常见的方法包括运用刚体运动学原理进行外参数求解、采用共轭梯度优化算法进行参数估计以及利用增强张力模型进行系统校准等多种方式。
1.4 图像分割(Image Segmentation)
图像分割(Image Segmentation)的核心目标是将一幅图像划分为若干个不同区域的前景与背景部分。在多个领域中都有广泛的应用,在虚拟现实技术中用于场景构建,在数字孪生中实现三维模型渲染,在图像修复领域可实现损坏区域复原,在目标跟踪系统中支持动态物体识别,在成本计算系统中能够实现资源费用精确统计等各项具体应用需求上均具有重要价值。现有方法主要包含基于颜色特征、基于空间信息以及深度学习技术等多种类型
2.OpenCV库
这是一个免费的多平台支持计算机视觉工具箱,并广泛应用于图像处理、机器学习算法以及3D图形渲染等多个领域。它不仅提供丰富的图像处理工具以及计算机视觉算法库,并且还支持Python编程语言、C++语言以及Java编程语言开发。以下部分将详细介绍OpenCV的基本功能与应用方法。
2.1 安装OpenCV
sudo apt-get update && sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
git clone https://github.com/opencv/opencv.git
cd opencv
mkdir release && cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_TBB=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D WITH_V4L=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_ENABLE_NONFREE=ON..
make -j$(nproc --all)
sudo make install
代码解读
安装后,就可以使用import cv2导入OpenCV了。
2.2 OpenCV模块
OpenCV包含了多样化的图像处理与计算机视觉功能,并且其核心功能模块的具体内容见下文
I/O 模块
I/O模块用于读取、写入图像、视频等文件,主要函数如下:
- imread():读取图像
- imwrite():保存图像
- VideoCapture():打开视频文件
Image Processing 模块
Image Processing模块包含基本的图像处理功能, 包括裁剪. 缩放. 翻转. 滤波. 轮廓发现等具体操作相关的函数将在下文详细列出
- resize(): 放大缩小处理;
- flip(): 水平翻转和垂直翻转;
- rotate(): 旋转变换;
- Canny(): 边缘识别算法;
- GaussianBlur: 高斯模糊滤波;
- Laplacian: 拉普拉斯运算用于边缘检测;
- Sobel: 斯obel算子用于梯度计算;
- dilate: 扩张边界操作;
- erode: 腐蚀边界操作;
- morphologyEx: 形态学运算处理;
- threshold: 基本二值化处理;
- adaptiveThreshold: 自适应二值化方法。
Geometric Transformation 模块
该模块实现了几何转换功能,并包括仿射转换、透视转换以及基于哈希的转换等技术。相关函数如下:
- warpAffine():仿射变换
- warpPerspective():透视变换
- remap():哈希化变换
Object Detection 模块
该模块旨在识别图像中的物体,并涵盖单个物体识别、多个物体跟踪以及嵌入式检测等多种技术方案。相关函数如下:
- findContours():寻找轮廓
- drawContours():绘制轮廓
Feature Matching 模块
该系统中的Feature Matching组件负责识别图像中的重要特征。这些特征点则可用来描述图像中的物体。相关函数如下:
- BFMatcher():Brute Force Matcher
- FlannBasedMatcher():FLANN-based Matcher
Machine Learning 模块
该模块负责实现一系列机器学习相关算法,并包含聚类分析、分类方法以及回归技术等内容。其中涉及的具体函数如下:
- KMeans():K-Means 聚类
- trainData():训练数据
- getLabels():获得标签
Camera Calibration 模块
该相机校准模块负责对相机进行标定, 主要包含内参数与外参数, 其中前者由相机自身相关参数及成像畸变参数共同确定, 而后者则涉及相机的外部位置与姿态信息及其与物体坐标的对应关系. 相关函数如下:
- calibrateCamera(): Camera calibration process
- stereoCalibrate(): Stereo camera calibration process
- undistort(): Removal of lens distortion effects
- initUndistortRectifyMap(): Precomputation of rectification mappings for image correction
High-Level API 模块
High-Level API 模块提供便捷且一致性的接口供调用者使用。例如,在进行颜色空间转换时使用 cv::cvtColor 函数,在读取图像内容时使用 cv::imread 函数,在保存图像时使用 cv::imwrite 函数,在执行中值滤波时使用 cv::medianBlur 函数等操作均可获得良好的效果。
3.特征检测(Feature Detection)
3.1 Harris Corner Detector
Harris Corner Detector基于图像局部亮度差异的特征提取方法是一种高度用于检测角点的技术。该算法对于边缘位置具有高度敏感性,因为其能够识别出边缘区域中的斑块并感知到这些区域中的亮度变化情况。其工作原理是通过计算像素邻域内的亮度差异及其方向变化来获取得分,然后筛选出具有较高得分的像素点作为角点。
设原图为binary image I ,其中坐标轴由变量i和j表示。其计算基于以下公式:
R_{ij} = \sum_{l=0}^k\sum_{m=-l}^{l}w^l_mk^mI_{i+li+\sigma j+mj}
其中k为偏置项阶数,在卷积运算中用于定义滤波器的空间扩展程度。变量s_{\theta}与s_{\phi}分别对应于滤波器在两个不同方向上的权重系数,并由方程(1)进行计算确定。该模型通过引入空间加权因子\omega_{s}^{p,q}对原始特征图进行加权融合处理以增强目标特征表达能力的同时也能够有效抑制噪声干扰减少误匹配情况的发生
为了确定关键点的位置, 可以计算每个像素与其周边像素在 Harris corner response 值上的差异。当某一点的 Harris corner response 比其邻域均值高出一定比例时, 可以认为该像素很可能是一个角点。可以选择适当的标准筛选候选角点, 进而进一步优化检测结果。
OpenCV 提供了 cornerHarris() 函数来检测和标记 Harris Corners。
void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k);
代码解读
参数:
source:源图像。destination:目标图像。windowSize:窗口尺寸,默认设置为 3像素。kernelSize:kernel size,默认为 3像素。weightFactor:加权系数,默认设置为 0.04。
返回值:无。
3.2 Shi-Tomasi Corner Detector
Shi-Tomasi Corner Detector 是 Harris Corner Detector 的改进版本,在精确度和稳定性方面均有显著提升。该方法的核心方法在于识别局部极值点,并通过矩阵的对角线元素以及各边距离之和来计算权重。
OpenCV提供了cornerSubPix函数用于检测并定位Shi-Tomasi Corners
void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners,
double qualityLevel, double minDistance, InputArray mask = noArray(), int blockSize = 3, bool useHarrisDetector = false, double k = 0.04);
代码解读
参数:
- 输入图像由 image 给出。
- 输出点集合为 corners.
- 最大候选点数量指定为 maxCorners.
- 点质量阈值设定为 qualityLevel,默认取值 0.01.
- 最小距离参数设置为 minDistance,默认设置为 1.
- 掩膜图像是 mask,默认为空状态.
- 窗口尺寸由 blockSize 决定,默认设置是 3."""
检测器使用情况指定 useHarrisDetector,默认关闭(false)。
Harris 检测器的加权系数 k 设置默认是 0.04。
返回值:无。
3.3 MSER (Maximally Stable Extremal Regions)
MSER 作为一种基于区域生长的多尺度边缘检测技术,在图像处理领域中被广泛应用于目标边界识别任务中。其核心方法在于通过反复结合相邻像素的边界信息来构建复杂的图像区域,并去除那些相对稳定的区域。
OpenCV 提供了 MSER_create() 函数来创建 MSER 对象。
Ptr<MSER> MSER_create(_InputArray _image, int _delta, int _min_area,
double _max_area, double _max_variation, double _min_diversity,
int _max_evolution, double _area_threshold, double _min_margin,
int _edge_blur_size);
代码解读
参数:
_image: 图像输入。_delta: 邻域差异幅度,默认设置为 2。_min_area: 最小区域面积阈值,默认设置为 60。_max_area: 最大区域面积上限,默认设置为 14400。_max_variation: 变异程度上限,默认设置为 0.25。_min_diversity: 多样性下限,默认设置为 0.2。_max_evolution: 演化次数上限,默认设置为 200。_area_threshold: 区域间隙阈值,默认设置为 1.01。_min_margin: 边缘宽度下限,默认设置为 0.003。_edge_blur_size: 边缘模糊半径,默认设置为5。
返回值:MSER 对象指针。
调用 detectRegions() 方法可以寻找和标记 MSER regions。
void detectRegions(OutputArrayOfArrays msers, InputArray image);
代码解读
参数:
msers:输出点集列表。image:输入图像。
