目录
[二、OpenCV 简介](#二、OpenCV 简介)
[(一)什么是 OpenCV](#(一)什么是 OpenCV)
[(二)OpenCV 的特点与优势](#(二)OpenCV 的特点与优势)
[(三)OpenCV 的应用领域](#(三)OpenCV 的应用领域)
[(一)安装 OpenCV 库](#(一)安装 OpenCV 库)
[四、OpenCV 基础操作](#四、OpenCV 基础操作)
一、引言
在当今数字化时代,计算机视觉技术广泛应用于各个领域,从安防监控中的人脸识别,到自动驾驶汽车的环境感知,再到图像编辑软件的智能功能,计算机视觉正悄然改变着我们的生活。OpenCV(Open Source Computer Vision Library)作为计算机视觉领域中最受欢迎的开源库之一,为开发者提供了丰富的函数和工具,使得处理图像和视频变得更加高效和便捷。
无论你是计算机科学专业的学生,对图像处理和计算机视觉充满好奇的爱好者,还是希望在项目中应用计算机视觉技术的开发者,本教程都将为你提供一个全面且易于理解的 OpenCV 入门指南。通过本教程的学习,你将掌握 OpenCV 的基本概念、安装方法,学会使用 OpenCV 进行图像读取、显示、处理以及视频操作等基础技能,为进一步深入研究计算机视觉打下坚实的基础。
二、OpenCV 简介
(一)什么是 OpenCV
OpenCV 是一个开源的计算机视觉库,由英特尔公司于 1999 年发起并开发,旨在提供一个通用的计算机视觉解决方案,帮助开发者快速实现各种计算机视觉应用。经过多年的发展,OpenCV 已经成为一个功能强大、应用广泛的库,拥有超过 2500 个优化算法,涵盖了从基本的图像处理和计算机视觉任务到复杂的机器学习算法等多个领域。
(二)OpenCV 的特点与优势
1.跨平台性:OpenCV 可以在多种操作系统上运行,包括 Windows、Linux、macOS 以及移动操作系统如 Android 和 iOS。这使得开发者可以在不同的平台上开发和部署计算机视觉应用,而无需担心平台兼容性问题。
2.多语言支持:OpenCV 提供了多种编程语言的接口,包括 C++、Python、Java、MATLAB 等。这使得不同背景的开发者都可以轻松地使用 OpenCV 进行开发,无论是喜欢使用 C++ 进行高性能计算的开发者,还是偏爱 Python 简洁语法的初学者,都能找到适合自己的开发方式。
3.丰富的功能:OpenCV 涵盖了计算机视觉领域的各个方面,包括图像滤波、特征提取、目标检测、图像分割、立体视觉、视频分析等。开发者可以利用这些丰富的功能,快速实现各种复杂的计算机视觉应用,而无需从头开始编写算法。
4.高效性:OpenCV 的算法经过了高度优化,采用了多种优化技术,如多线程处理、SIMD 指令集等,以提高计算效率。这使得 OpenCV 在处理大规模图像和视频数据时,能够保持高效运行,满足实时性要求较高的应用场景。
5.活跃的社区:OpenCV 拥有一个庞大且活跃的社区,社区成员来自世界各地的开发者、研究人员和爱好者。在社区中,你可以找到丰富的文档、教程、示例代码以及开源项目,还可以与其他开发者交流经验、分享见解,获取帮助和支持。
(三)OpenCV 的应用领域
1.计算机视觉与图像处理:OpenCV 最初就是为计算机视觉和图像处理任务而设计的,它在这个领域有着广泛的应用。例如,图像滤波可以去除图像中的噪声,提高图像质量;图像增强可以突出图像中的细节,改善图像的视觉效果;图像分割可以将图像中的不同物体或区域分离出来,为后续的分析和处理提供基础。
2.安防监控:在安防监控领域,OpenCV 被广泛应用于人脸识别、行为分析、目标跟踪等方面。通过摄像头采集视频数据,利用 OpenCV 的算法对视频中的图像进行处理和分析,可以实现实时的安防监控,及时发现异常情况并发出警报。
3.自动驾驶:自动驾驶汽车需要对周围环境进行实时感知和理解,OpenCV 在其中发挥着重要作用。通过摄像头采集道路图像,利用 OpenCV 的目标检测算法可以识别出车辆、行人、交通标志和信号灯等目标物体,为自动驾驶汽车的决策和控制提供依据。
4.医疗影像分析:在医疗领域,OpenCV 可以用于医疗影像的处理和分析,如 X 光、CT、MRI 等影像的处理。通过图像增强、分割和特征提取等技术,可以帮助医生更准确地诊断疾病,提高医疗诊断的准确性和效率。
5.工业检测:在工业生产中,OpenCV 可以用于产品质量检测、缺陷识别、尺寸测量等方面。通过对工业生产线上采集的图像进行分析,可以实现自动化的质量检测,提高生产效率和产品质量。
6.智能机器人:智能机器人需要具备视觉感知能力,以便与周围环境进行交互。OpenCV 可以为智能机器人提供图像识别、目标定位、路径规划等功能,帮助机器人更好地完成任务。
三、环境搭建
(一)安装 OpenCV 库
安装好 Python 后,我们可以使用 pip 工具来安装 OpenCV 库。pip 是 Python 的包管理工具,它可以帮助我们方便地安装、升级和管理 Python 库。打开命令行终端,输入以下命令安装 OpenCV 库:
python
pip install opencv - python
如果你需要安装 OpenCV 的扩展模块(如 contrib 模块),可以使用以下命令:
python
pip install opencv - python - headless opencv - contrib - python - headless
在安装过程中,pip 会自动下载并安装 OpenCV 库及其依赖项。安装完成后,你可以在 Python 代码中通过import cv2语句来导入 OpenCV 库,如果没有报错,则说明安装成功。
四、OpenCV 基础操作
(一)图像读取与显示
1.读取图像:在 OpenCV 中,使用cv2.imread()函数来读取图像。该函数的第一个参数是图像文件的路径,第二个参数是读取图像的方式,常用的读取方式有以下几种:
cv2.IMREAD_COLOR:以彩色模式读取图像,这是默认的读取方式。在这种模式下,图像的颜色通道顺序为 BGR(Blue, Green, Red)。
cv2.IMREAD_GRAYSCALE:以灰度模式读取图像,图像将被转换为单通道的灰度图像。
cv2.IMREAD_UNCHANGED:读取图像时保留图像的原始格式,包括 alpha 通道(如果有的话)。以下是读取彩色图像和灰度图像的示例代码:
python
import cv2
# 读取彩色图像
img_color = cv2.imread('Dog.png', cv2.IMREAD_COLOR)
if img_color is None:
print('无法读取图像')
else:
print('彩色图像尺寸:', img_color.shape)
# 读取灰度图像
img_gray = cv2.imread('Dog.png', cv2.IMREAD_GRAYSCALE)
if img_gray is None:
print('无法读取图像')
else:
print('灰度图像尺寸:', img_gray.shape)

在上述代码中,首先使用cv2.imread()函数读取图像,然后通过判断返回值是否为None来检查图像是否读取成功。如果图像读取成功,可以通过img.shape属性获取图像的尺寸,该属性返回一个元组,包含图像的高度、宽度和通道数(对于灰度图像,通道数为 1;对于彩色图像,通道数为 3)。
- 显示图像:使用cv2.imshow()函数来显示图像。该函数的第一个参数是窗口的名称,第二个参数是要显示的图像。在显示图像后,需要使用cv2.waitKey()函数等待用户按键,否则图像窗口会一闪而过。cv2.waitKey()函数的参数是等待的时间(单位为毫秒),如果参数为 0,则表示无限等待,直到用户按下任意键。最后,使用cv2.destroyAllWindows()函数关闭所有打开的图像窗口。
以下是显示彩色图像和灰度图像的示例代码:
python
import cv2
# 读取彩色图像
img_color = cv2.imread('Dog.png', cv2.IMREAD_COLOR)
if img_color is None:
print('无法读取图像')
else:
cv2.imshow('彩色图像', img_color)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 读取灰度图像
img_gray = cv2.imread('Dog.png', cv2.IMREAD_GRAYSCALE)
if img_gray is None:
print('无法读取图像')
else:
cv2.imshow('灰度图像', img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,分别读取彩色图像和灰度图像,并使用cv2.imshow()函数在不同的窗口中显示图像,通过cv2.waitKey(0)函数等待用户按键,最后使用cv2.destroyAllWindows()函数关闭所有窗口。
(二)图像保存
使用cv2.imwrite()函数可以将处理后的图像保存到磁盘上。该函数的第一个参数是保存图像的文件名,第二个参数是要保存的图像。文件名的扩展名决定了保存图像的格式,OpenCV 支持多种图像格式,如 JPEG、PNG、BMP 等。
以下是将彩色图像转换为灰度图像并保存的示例代码:
python
import cv2
# 读取彩色图像
img_color = cv2.imread('image.jpg', cv2.IMREAD_COLOR)
if img_color is None:
print('无法读取图像')
else:
# 转换为灰度图像
img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)
# 保存灰度图像
cv2.imwrite('image_gray.jpg', img_gray)
print('灰度图像已保存')
在上述代码中,首先读取彩色图像,然后使用cv2.cvtColor()函数将彩色图像转换为灰度图像(关于cv2.cvtColor()函数将在后续介绍),最后使用cv2.imwrite()函数将灰度图像保存为image_gray.jpg文件。
(三)图像基本属性获取
通过图像的shape属性可以获取图像的高度、宽度和通道数等基本属性。对于彩色图像,shape属性返回一个包含三个元素的元组,分别表示图像的高度、宽度和通道数(BGR 通道数为 3);对于灰度图像,shape属性返回一个包含两个元素的元组,分别表示图像的高度和宽度(通道数为 1)。
此外,还可以通过图像的dtype属性获取图像的数据类型,OpenCV 中图像的数据类型通常为numpy.uint8,表示无符号 8 位整数,其取值范围为 0 - 255。
以下是获取图像基本属性的示例代码:
python
import cv2
# 读取彩色图像
img_color = cv2.imread('Dog.png', cv2.IMREAD_COLOR)
if img_color is None:
print('无法读取图像')
else:
height, width, channels = img_color.shape
print('彩色图像高度:', height)
print('彩色图像宽度:', width)
print('彩色图像通道数:', channels)
print('彩色图像数据类型:', img_color.dtype)
# 读取灰度图像
img_gray = cv2.imread('Dog.png', cv2.IMREAD_GRAYSCALE)
if img_gray is None:
print('无法读取图像')
else:
height, width = img_gray.shape
print('灰度图像高度:', height)
print('灰度图像宽度:', width)
print('灰度图像数据类型:', img_gray.dtype)

在上述代码中,分别读取彩色图像和灰度图像,并通过shape属性和dtype属性获取图像的基本属性并打印输出。
(四)图像颜色空间转换
在 OpenCV 中,图像的颜色空间通常有 BGR、RGB、HSV、HLS、Lab 等。默认情况下,cv2.imread()函数读取的图像是 BGR 颜色空间。在某些情况下,我们需要将图像从一种颜色空间转换为另一种颜色空间,例如将 BGR 图像转换为灰度图像、将 BGR 图像转换为 HSV 图像等。
使用cv2.cvtColor()函数可以实现图像颜色空间的转换。该函数的第一个参数是要转换的图像,第二个参数是转换的代码,用于指定源颜色空间和目标颜色空间。常用的颜色空间转换代码如下:
cv2.COLOR_BGR2GRAY:将 BGR 图像转换为灰度图像。
cv2.COLOR_BGR2RGB:将 BGR 图像转换为 RGB 图像。
cv2.COLOR_BGR2HSV:将 BGR 图像转换为 HSV 图像。
cv2.COLOR_BGR2HLS:将 BGR 图像转换为 HLS 图像。
cv2.COLOR_BGR2Lab:将 BGR 图像转换为 Lab 图像。
以下是将 BGR 图像转换为灰度图像、RGB 图像和 HSV 图像的示例代码:
python
import cv2
# 读取BGR图像
img_bgr = cv2.imread('Dog.png', cv2.IMREAD_COLOR)
if img_bgr is None:
print('无法读取图像')
else:
# 转换为灰度图像
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
cv2.imshow('灰度图像', img_gray)
# 转换为RGB图像
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
cv2.imshow('RGB图像', img_rgb)
# 转换为HSV图像
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
cv2.imshow('HSV图像', img_hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,首先读取 BGR 图像,然后使用cv2.cvtColor()函数分别将 BGR 图像转换为灰度图像、RGB 图像和 HSV 图像,并使用cv2.imshow()函数显示转换后的图像。
(五)图像的基本运算
1.图像加法:在 OpenCV 中,可以使用cv2.add()函数对两幅图像进行加法运算。图像加法通常用于图像融合、图像增强等场景。需要注意的是,参与加法运算的两幅图像必须具有相同的尺寸和数据类型。
以下是图像加法的示例代码:
python
import cv2
import numpy as np
# 读取两幅图像
img1 = cv2.imread('image1.jpg', cv2.IMREAD_COLOR)
img2 = cv2.imread('image2.jpg', cv2.IMREAD_COLOR)
if img1 is None or img2 is None:
print('无法读取图像')
else:
# 确保两幅图像尺寸相同
if img1.shape == img2.shape:
# 图像加法
img_add = cv2.add(img1, img2)
cv2.imshow('图像加法结果', img_add)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print('两幅图像尺寸不同,无法进行加法运算')
(六)视频读写
python
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()