《OpenCV 基础全攻略:从入门到精通》
一、OpenCV 简介
OpenCV(Open Source Computer Vision Library)作为热门的计算机视觉库,自 1999 年由英特尔公司首次发布以来,在计算机视觉领域发挥着至关重要的作用。它具有诸多特点和优势,广泛应用于各个领域。
(一)特点
- 跨平台支持:OpenCV 支持多个操作系统,包括 Windows、Linux、macOS、Android 和
iOS。这使得开发者可以在不同的平台上使用相同的代码,大大提高了开发效率。 - 多语言接口:除了 C++,OpenCV 还提供了 Python、Java 和 MATLAB
等多种编程语言的接口。这使得不同编程语言的开发者都可以轻松地使用 OpenCV 进行计算机视觉和图像处理任务。 - 丰富的功能:OpenCV 包含了超过 2500
个优化的算法,涵盖了从基本的图像处理到复杂的机器学习模型。例如,在图像处理方面,它提供了滤波、边缘检测、形态学操作等算法;在视频分析方面,提供了运动检测、对象跟踪等功能;在特征检测和描述方面,提供了 SIFT、SURF、ORB 等算法;在对象检测方面,包含了人脸检测、行人检测等预训练模型;在机器学习方面,提供了各种机器学习算法,如 KNN、SVM、决策树等。 - 高效性:OpenCV 的许多核心功能都经过高度优化,能够在实时应用中高效运行。例如,在工业检测中,OpenCV
可以快速地检测产品的缺陷、进行产品分类和机器视觉等任务,提高生产效率。 - 社区支持:作为一个开源项目,OpenCV
拥有一个活跃的开发者和用户社区,提供了丰富的文档和教程。开发者可以在社区中交流经验、分享代码和解决问题,促进了 OpenCV
的不断发展和完善。
(二)优势
- 编程语言:OpenCV 基于 C++ 实现,同时提供 Python、Ruby、Matlab 等语言的接口。OpenCV-Python 是
OpenCV 的 Python API,结合了 OpenCV C++ API 和 Python 语言的最佳特性。Python
语言本身简洁易懂,结合 OpenCV 的强大功能,使得图像处理和计算机视觉的开发变得更加简单。 - 跨平台:可以在不同的系统平台上使用,包括 Windows,Linux,OS X,Android 和 iOS。基于 CUDA 和
OpenCL 的高速 GPU 操作接口也在积极开发中,进一步提高了 OpenCV 的性能和跨平台性。 - 丰富的
API:完善的传统计算机视觉算法,涵盖主流的机器学习算法,同时添加了对深度学习的支持。这使得开发者可以在一个库中完成多种任务,无需切换不同的库和工具,提高了开发效率。
(三)应用场景
- 计算机视觉:OpenCV
可用于计算机视觉任务,如目标检测、图像分类、人脸识别、姿态估计、运动估计、光流估计等。例如,在人脸识别方面,OpenCV
可以快速准确地检测和识别出图像中的人脸,广泛应用于安防监控、门禁系统等领域。 - 视频分析:OpenCV 可用于视频分析任务,如视频跟踪、行为识别、动作识别等。例如,在智能交通系统中,OpenCV
可以检测和跟踪车辆、识别车牌和行人,统计交通流量,提高交通管理效率。 - 机器学习:OpenCV
集成了各种机器学习算法,如支持向量机、随机森林、朴素贝叶斯等,可以用于图像分类、目标检测等任务。例如,在医学影像处理中,OpenCV
可以使用机器学习算法对医学图像进行分类和识别,辅助医生进行诊断。 - 医学影像处理:OpenCV 可以用于医学影像处理,如医学图像分割、医学图像配准、医学图像增强等。例如,在肺部结节检测中,OpenCV
可以通过图像分割和特征提取算法,快速准确地检测出肺部结节,提高诊断准确性。 - 自动驾驶:OpenCV 可以用于自动驾驶,如车道检测、交通标志识别、障碍物检测等。例如,在自动驾驶汽车中,OpenCV
可以实时检测车道线、交通标志和障碍物,为汽车提供导航和安全保障。 - 工业检测:OpenCV 可以用于工业检测,如缺陷检测、产品分类、机器视觉等。例如,在电子产品制造中,OpenCV
可以检测产品的外观缺陷,提高产品质量。 - 游戏开发:OpenCV 可以用于游戏开发,如虚拟现实、增强现实等。例如,在增强现实游戏中,OpenCV
可以通过摄像头实时捕捉现实场景,将虚拟物体与现实场景融合,提供更加真实的游戏体验。
二、安装与配置
- 在 pycharm 中的安装 在 Pycharm 中安装 OpenCV 有多种方法。 一种方法是直接在 Pycharm 中进行安装。进入
Pycharm 后,选择 “File”——“Settings”,然后选择 “Project Interpreter” 右上方的符号
“+”。在搜索框中输入 opencv,选择 py-opencv,如下显示 “installing”,等待安装即可。 - 使用 pip 安装。在命令行中执行 “pip install python-opencv”。但在网络距离美国较远的情况下,或 PIP
版本未达到要求的情况下,可能会安装失败。解决方法有:一是重试;二是使用科学方法,但要注意使用科学方法的端口问题,切记不要和本地计算机使用同一个端口,容易造成
Pycharm 未知错误;三是手动去官网下载文件。有两种类型的手动安装文件,setup.py 和 XXXX.whl。这两种文件都可以通过
Pycharm 的命令行工具直接 cd 到目录进行直接安装。方法一是 “python setup.py install”,pip
安装较为简单;方法二是 “pip install C:windows/system/001/002.whl”,后面的路径为
XXXX.whl 文件的所在地址,如果地址不知道,可以通过属性查看。 - 安装成功后,可以通过以下代码段进行验证:
import numpy as np
import cv2 as cv
original = cv.imread('gongjiaoka.jpg')
grayImg = cv.imread('gongjiaoka.jpg', cv.IMREAD_GRAYSCALE)
cv.imwrite('mygray.jpg', grayImg)
cv.imshow('mygray.jpg',grayImg)
cv.imshow('gongjiaoka.jpg',original)
cv.waitKey(0)
三、OpenCV 函数详解
1. 图像读取函数 cv2.imread ()
- 参数介绍:
- cv2.imread () 函数用于读取图像文件,它有两个主要参数。第一个参数是要读入图片的完整路径,比如
“dot.jpg”。第二个参数是读入方式,有三种选择:- cv2.IMREAD_COLOR:默认参数,以彩色模式读取图像,忽略 alpha 通道。对应的数值是
1。此模式下读取的图像是一个三维数组,前两维表示图像的像素坐标,最后一维表示图像的颜色通道(通常是 BGR 三个通道)。 - cv2.IMREAD_GRAYSCALE:以灰度模式读取图像,将图像转换为单通道灰度图像。对应的数值是
0。读取后的图像是一个二维数组,每个元素表示对应像素的灰度值。 cv2.IMREAD_UNCHANGED:读取包括 alpha
通道在内的所有图像信息。对于带有 alpha 通道的图像(如 PNG 图像),将保持完整信息。对应的数值是
-1。这种模式下读取的图像可能是一个四维数组,前两维表示像素坐标,第三维表示颜色通道,第四维表示 alpha 通道(透明度信息)。
- cv2.IMREAD_COLOR:默认参数,以彩色模式读取图像,忽略 alpha 通道。对应的数值是
- cv2.imread () 函数用于读取图像文件,它有两个主要参数。第一个参数是要读入图片的完整路径,比如
- 代码示例:img = cv2.imread
(‘dot.jpg’,cv2.IMREAD_COLOR)。此代码将以彩色模式读取名为‘dot.jpg’的图像,并将其存储在变量 img
中,img 是一个 numpy 数组,可用于后续的图像处理操作。
2. 图像显示函数 cv2.imshow ()
- 参数介绍: cv2.imshow ()
函数用于显示图像,它有两个参数。第一个参数是显示图像的窗口的名字,这个名字可以是任意字符串,用于唯一标识一个窗口。例如,可以命名为
“显示图”。第二个参数是要显示的图像,通常是一个 numpy 数组,表示图像的像素数据。 - 窗口调整: cv2.WINDOW_AUTOSIZE
会根据自动图像大小调整窗口,这意味着窗口的大小会自动适应图像的尺寸,用户无法手动调整窗口大小。 cv2.WINDOW_NORMAL
允许修改窗口大小。使用此模式,用户可以通过鼠标拖动窗口边框来调整窗口的大小,以适应不同的显示需求。 - 代码示例:cv2.imshow (‘显示图’,img)。此代码将在名为 “显示图” 的窗口中显示图像
img。如果没有其他操作,窗口会一直保持显示状态,直到用户手动关闭窗口或通过代码进行关闭。
3. 图像保存函数 cv2.imwrite ()
- 参数介绍: cv2.imwrite ()
函数用于保存图像,它有两个参数。第一个参数是要保存的路径,可以是一个字符串,表示图像文件的完整路径和文件名,包括文件扩展名(如
“myimage.jpg”)。第二个参数是要保存的图像,通常是一个 numpy 数组,表示图像的像素数据。 - 代码示例:cv2.imwrite (‘path’,name_1)。此代码将图像 name_1
保存到指定的路径‘path’中。保存的图像格式由路径中的文件扩展名决定,例如,如果路径是 “myimage.jpg”,则图像将以 JPEG
格式保存。
四、基本教程
1. opencv 配置
可参考链接:https://blog.csdn.net/shuiyixin/article/details/80386022。
2. 加载、修改、显示及保存图像
- 加载图像:cv2.imread () 是 OpenCV
中用于读取图像文件的函数。它有两个主要参数,第一个参数是要读入图片的完整路径,比如
“dot.jpg”;第二个参数是读入方式,有三种选择:- cv2.IMREAD_UNCHANGED(<0)表示加载原图,不做任何改变。OpenCV 支持
JPG、PNG、TIFF等常见格式图像文件加载。 - cv2.IMREAD_GRAYSCALE(0)表示把原图作为灰度图加载进来。
- cv2.IMREAD_COLOR(>0)表示把原图作为 RGB 图像加载进来。
- cv2.IMREAD_UNCHANGED(<0)表示加载原图,不做任何改变。OpenCV 支持
- 修改图像:cv2.cvtColor ()
可把图像从一个色彩空间转换到另一个色彩空间。它具有三个参数,第一个参数是源图像,第二个参数是目标图像,第三个参数是源图像和目标图像的色彩空间转换方式,如COLOR_BGR2GRAY(从
RGB 转化到 Gray,从彩色转换为灰色)。 - 显示图像:cv2.imshow
()用于显示图像,它有两个参数。第一个参数是显示图像的窗口的名字,这个名字可以是任意字符串,用于唯一标识一个窗口;第二个参数是要显示的图像,通常是一个numpy
数组,表示图像的像素数据。窗口特性可以通过参数设置,如
WINDOW_AUTOSIZE会自动根据图像的大小调整窗口大小,不能人为改变窗口大小;WINDOW_NORMAL 允许修改窗口大小。 - 保存图像:cv2.imwrite ()
用于保存图像文件到指定目录路径。它有两个参数,第一个参数是要保存的路径,可以是一个字符串,表示图像文件的完整路径和文件名,包括文件扩展名(如 “myimage.jpg”);第二个参数是要保存的图像,通常是一个 numpy 数组,表示图像的像素数据。只有 8 位、16 位的 PNG、JPG、Tiff 文件格式而且是单通道或者三通道的 BGR 的图像才可以通过这种方式保存。保存 PNG格式的时候可以保存透明通道的图片,同时可以指定压缩参数。
3. 图像像素及掩膜操作详解
- 方法一:直接手写获取图像矩阵的宽度、高度和指针,进行像素值计算。获取图像像素指针可以通过 Mat.ptr(int i =
0) 来获取像素矩阵的指针,索引