简介
- OpenCV 相关理论基础知识笔记
计算机视觉 书籍推荐
计算机视觉是一个广泛且不断发展的领域,涵盖了从基础图像处理到深度学习与神经网络的高级应用。以下是一些经典且受推荐的计算机视觉书籍,适用于不同水平的读者:
基础入门书籍
《学习OpenCV: 计算机视觉应用的设计与实现》(Learning OpenCV: Computer Vision with the OpenCV Library)
- 作者:Gary Bradski, Adrian Kaehler
- 简介:这是一本经典的计算机视觉书籍,适合初学者学习如何使用 OpenCV 实现计算机视觉应用。书中详细介绍了 OpenCV 的各种功能,并且包含了大量的实例代码,帮助读者快速掌握计算机视觉的基本概念和技巧。
- 适用读者:从初学者到中级开发者。
《数字图像处理》(Digital Image Processing)
- 作者:Rafael C. Gonzalez, Richard E. Woods
- 简介:这是一本经典的图像处理教材,详细讲解了图像处理的基础理论,包括图像的表示、变换、增强、恢复等内容。适合需要打下扎实图像处理基础的读者。
- 适用读者:从初学者到中级研究人员。
《计算机视觉:算法与应用》(Computer Vision: Algorithms and Applications)
- 作者:Richard Szeliski
- 简介:这本书非常适合计算机视觉领域的初学者和进阶者。内容覆盖了图像处理的基础知识、特征检测、匹配、深度估计等重要概念,同时也有一些现代的应用案例。
- 适用读者:初学者到中级开发者、研究人员。
进阶书籍
《计算机视觉:模式识别方法与应用》(Computer Vision: A Modern Approach)
- 作者:David A. Forsyth, Jean Ponce
- 简介:这本书深入探讨了计算机视觉的各种高级方法,如图像分割、图像理解、物体识别等。书中结合了数学原理和实际应用案例,适合对计算机视觉有一定基础的读者。
- 适用读者:中级到高级研究人员。
《多视角几何学》(Multiple View Geometry in Computer Vision)
- 作者:Richard Hartley, Andrew Zisserman
- 简介:本书详细讨论了多视角几何学和三维重建的基础理论,是计算机视觉中非常重要的一部分。内容包括相机标定、立体视觉、图像匹配等高级技术。
- 适用读者:有一定基础的计算机视觉研究者和工程师。
《深度学习与计算机视觉:图像分类与分割实战》(Deep Learning for Computer Vision with Python)
- 作者:Adrian Rosebrock
- 简介:这本书专注于使用深度学习技术解决计算机视觉中的实际问题,尤其是图像分类和分割任务。适合想深入了解深度学习与计算机视觉结合的读者。
- 适用读者:中级到高级开发者,尤其是对深度学习和计算机视觉交叉领域有兴趣的读者。
深度学习与计算机视觉
《深度学习:算法与应用》(Deep Learning: A Practitioner’s Approach)
- 作者:Adam Gibson, Josh Patterson
- 简介:这本书介绍了深度学习的基本概念和方法,并且结合了很多计算机视觉的应用实例,尤其是神经网络和卷积神经网络(CNN)的应用。
- 适用读者:对深度学习有兴趣并希望将其应用于计算机视觉的开发者。
《卷积神经网络:原理与实现》(Convolutional Neural Networks: Principles and Applications)
- 作者:Zhang, Lei
- 简介:本书聚焦于卷积神经网络(CNN)的原理与实际应用,适合计算机视觉中涉及到深度学习模型的研究人员与开发者。
- 适用读者:中级到高级开发者、研究人员。
《深度学习计算机视觉实战》
- 作者:Chollet
- 简介:这本书由 Keras 框架的作者撰写,讲解了如何通过深度学习处理计算机视觉问题。内容涵盖了图像分类、检测、分割等内容,并包含大量的代码实例。
- 适用读者:有深度学习基础并希望应用于计算机视觉的开发者。
特定领域书籍
- 《计算机视觉中的图像和视频分析:技术与应用》(Image and Video Processing in Computer Vision: Technology and Applications)
- 作者:M. T. Sun, R. Jain
- 简介:本书讲解了计算机视觉中的视频处理、图像分析和多媒体处理技术。适合需要在视频流、目标跟踪和动态场景分析等方面深耕的研究人员。
- 适用读者:研究人员及从事视频和动态图像处理的工程师。
总结
- 对于入门者来说,《学习OpenCV》 和 《数字图像处理》 是非常好的选择,能够帮助读者建立坚实的基础。
- 若要深入研究计算机视觉的核心概念,可以选择 《计算机视觉:算法与应用》 或 《计算机视觉:模式识别方法与应用》。
- 如果你已经有一定的基础并希望进一步学习深度学习应用于计算机视觉,《深度学习与计算机视觉:图像分类与分割实战》 和 《卷积神经网络:原理与实现》 是很好的进阶书籍。
根据你的学习目标和兴趣,选择适合的书籍开始深入探索计算机视觉的世界!
windows下编译并调试OpenCV程序
在windows下编译并调试OpenCV程序,在进行调试时,会出现无法调试或无法运行问题。
解决方法
- 将 opencv_world480d.dll 文件拷贝到可执行程序同级目录
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
3sudo 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
3sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
- 找不到
下载源码,解压缩,创建build文件夹
cmake -D CMAKE_INSTALL_PREFIX=/usr/local CMAKE_BUILD_TYPE=Release OPENCV_GENERATE_PKGCONFIG=ON OPENCV_ENABLE_NONFREE=True ..
sudo make -j6
sudo make install
环境配置
- 修改
/etc/bash.bashrc
,增加内容:1
2PKG_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> ¶ms=std::vector<int>())'
imgproc
Image Processing
Image
和Process
这两个单词的缩写组合,图像处理模块包含如下内容:
- 线性和非线性的图像滤波
- 图像的几何变换
- 其他图像转换
- 直方图相关
- 结构分析和形状描述
- 运动分析和对象跟踪
- 特征检测
- 目标检测等内容
可以执行诸如图像过滤,形态学操作,几何变换,颜色转换,图像绘制,直方图,形状分析,运动分析,特征检测等操作
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 动态库链接顺序:
链接 OpenCV 核心库:
opencv_core
这是 OpenCV 库的核心组件,提供了图像处理和数据结构的基本功能。在链接时,应首先链接这个核心库。链接 OpenCV 模块库:
OpenCV 包含了许多模块,如图像 I/O、图像处理、特征检测、目标跟踪等。根据你的需要,链接所需的模块库,例如opencv_imgproc
、opencv_highgui
、opencv_objdetect
等。链接其他依赖库:
OpenCV 有时会依赖其他第三方库,如图像编解码库(如 libjpeg、libpng)和矩阵操作库(如 Eigen)。如果你使用了这些功能或模块,需要链接这些依赖库。
链接顺序的目的是确保编译器能够按照正确的顺序解析符号并建立正确的依赖关系。在编译器搜索符号时,它会按照链接顺序从左到右查找库文件中的符号。因此,如果一个库依赖于另一个库,后者应该在前者的链接顺序中出现。
请注意,具体的链接顺序可能因操作系统和编译器而异。因此,建议参考 OpenCV 官方文档或相关文档,以获得特定平台和编译环境下正确的链接顺序。
以下是一个示例的编译命令,展示了如何在 C++ 项目中正确链接 OpenCV 动态库:
1 | g++ main.cpp -o main \ |
在上述示例中,-lopencv_core
、-lopencv_imgproc
和 -lopencv_highgui
是链接 OpenCV 核心库和模块库的选项。-ljpeg
、-lpng
和 -lz
是链接其他依赖库的选项。
请根据你的具体需求和所使用的 OpenCV 模块,适当调整链接选项和顺序。
OpenCV 模块库
OpenCV 4.5.2 包含了许多模块库,每个模块库提供了不同的功能和算法。下面是对一些常用的 OpenCV 4.5.2 模块库进行简要的详解:
opencv_core
:- 核心组件,提供了图像处理和数据结构的基本功能,如矩阵操作、数组操作、像素访问等。
opencv_imgproc
:- 图像处理模块,提供了丰富的图像处理算法和功能,如图像滤波、边缘检测、形态学操作、直方图均衡化等。
opencv_highgui
:- 用户界面模块,用于显示图像和处理用户输入,提供了图像显示、窗口管理、鼠标和键盘事件处理等功能。
opencv_video
:- 视频分析模块,包含了视频处理和分析的算法和功能,如光流估计、背景建模、物体跟踪等。
opencv_videoio
:- 视频输入输出模块,用于读取和写入视频文件,支持多种视频格式和编解码器。
opencv_objdetect
:- 目标检测模块,提供了训练和使用目标检测器的功能,包括人脸检测、物体检测等。
opencv_features2d
:- 特征检测和描述子模块,提供了各种特征检测算法和描述子提取方法,如关键点检测、特征匹配等。
opencv_calib3d
:- 相机标定和三维重构模块,包含了相机标定、立体视觉、三维重建等相关算法和功能。
opencv_ml
:- 机器学习模块,提供了常见的机器学习算法和工具,如分类、回归、聚类等。
opencv_dnn
:- 深度学习推理模块,支持使用深度学习模型进行图像分类、目标检测、语义分割等任务。
opencv_imgcodecs
:- 图像编解码模块,支持图像的读取和保存,以及常见图像格式的编码和解码。
opencv_shape
:- 形状描述模块,提供了形状匹配和描述子计算等功能,适用于物体识别和形状分析。
以上只是 OpenCV 4.5.2 中的一些常用模块库的简要介绍,OpenCV 还包含了其他模块库,如图像分割、图像拼接、光学字符识别等。你可以参考 OpenCV 官方文
档以获取关于每个模块库的更详细信息和使用示例。
OpenCV和YOLO是什么样的关系
OpenCV,全名Open Source Computer Vision,是一个跨平台的计算机视觉库,它包含了大量的图像处理和计算机视觉方面的算法,被广泛应用于实时图像处理、机器学习、机器人视觉等领域。
YOLO,全名You Only Look Once,是一种深度学习的对象检测算法。它的特点是只需要一次前向传播就可以预测出图像中的对象以及它们的位置,因此在实时性和准确性之间取得了良好的平衡,被广泛应用于车辆检测、人脸识别等任务。
OpenCV和YOLO在许多计算机视觉任务中可以结合使用,形成一个完整的图像识别系统。在这样的系统中,OpenCV主要负责图像的获取、预处理和结果的可视化,YOLO则负责对处理过的图像进行深度学习对象检测。