在计算机视觉的广袤领域中,OpenCV 是一座极为关键的里程碑。无论是在前沿的学术研究,还是在蓬勃发展的工业界,OpenCV 凭借其强大的功能与高效的性能,为开发者提供了丰富的图像处理和计算机视觉算法,助力无数项目落地。本文将深入探讨 OpenCV 的基础知识,包括其核心概念、安装配置、常用操作以及实际应用,希望能帮助读者全面掌握 OpenCV,为后续的计算机视觉开发筑牢根基。
一、 OpenCV 是什么?
OpenCV,即 Open Source Computer Vision Library,是一个基于 BSD 许可发行的跨平台计算机视觉库。它由英特尔公司发起并参与开发,历经多年的持续发展与完善,已经成为计算机视觉领域的行业标准之一。OpenCV 支持 C++、Python、Java 等多种主流编程语言,极大地降低了开发者的学习门槛。同时,它拥有超过 2500 种优化算法,从基础的图像滤波、特征提取,到复杂的目标检测、立体视觉和机器学习算法,几乎涵盖了计算机视觉的各个方面。OpenCV 的高效性和易用性,使其在学术研究、工业生产和商业产品中都得到了广泛的应用。
二、 安装 OpenCV
Python 环境下安装
在 Python 环境中,使用pip工具可以轻松安装 OpenCV。打开命令行终端,输入以下命令:
pip install opencv - python
三、Opencv的简单操作
1、Opencv的导入
在python中Opencv用cv2来表示
import cv2
2、图片的读取
这里的图片可以是任意一张图片,网站上随便下载一张就行,这里就不附文件了
图片的读取不能有中文
# a = cv2.imread('mm.jpg')#路径不可为中文
# cv2.imshow('tu', a)
# b = cv2.waitKey(10000000)
# print(b) # 打印按下按键对应的 ASCII 码,无按键则返回 -1
# cv2.destroyAllWindows()#释放缓存
# print('图像属性')
# print("图像形状(shape):", a.shape)
# print("图像数据类型(dtype):", a.dtype)
# print("图像大小(size):", a.size)
3、图片的灰度转换
# b = cv2.imread('mm.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.imshow('xx', b)
# cv2.waitKey(0)
# cv2.destroyAllWindows()#释放缓存
# print('灰度图像属性')
# print("图像形状(shape):", b.shape)
# print("图像数据类型(dtype):", b.dtype)
# print("图像大小(size):", b.size)
# # 保存灰度图像
# cv2.imwrite('ting98_GRAY.jpg', b)
4、视频文件读取
这里规定了waitKey == 27就表示按下ASCLL码值为27(ESC键)才能退出播放
video_capture = cv2.VideoCapture('your_name.mp4')
if not video_capture.isOpened():
print('无法打开文件:')
exit()
while True:
ret,frame = video_capture.read()
if not ret:
break
# frame = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('video',frame)
if cv2.waitKey(60) == 27:
break
video_capture.release()
cv2.destroyAllWindows()#每次运行完都要释放缓存
5、ROI提取
这个看上去高大上,但实际上就是python基础里的切片,将图片上的某部分提取出来
a = cv2.imread('mm.jpg') # 重新读图(确保 a 有效,也可复用之前的 a ,这里为清晰重写 )
if a is not None:
# ROI 切片:行范围 350-650 ,列范围 250-500 (根据需求调整)
b = a[350:650, 250:500]
cv2.imshow('yuantu', a) # 显示原图
cv2.imshow('qiepian', b) # 显示 ROI 区域
cv2.waitKey(0) # 按任意键继续
cv2.destroyAllWindows()
6、RGB 颜色通道提取
a = cv2.imread(r'./img.png')
b = cv2.imread(r'./mm.png')
# 2. 提取颜色通道
a1 = a[:, :, 0] # 蓝色通道(B通道)
a2 = a[:, :, 1] # 绿色通道(G通道)
a3 = a[:, :, 2] # 红色通道(R通道)
blue=np.zeros_like(b)
blue[:, :, 0] =b[:, :, 0]
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# 4. 设置窗口显示时间,单位为毫秒(这里设置为100秒,可以根据需要调整)
cv2.waitKey(100000)
# 5. 关闭所有窗口
cv2.destroyAllWindows()
注意:我们这里是显示蓝色通道的图像,但是所显示的图片确是灰色的,那是因为只显示蓝色通道时, 实际上是将蓝色通道作为亮度值,是单个通道,这会导致图像呈现为灰色。 想要展示只包含蓝色通道信息的彩色图像,可以将图像中的绿色通道和红色通道设为0,即移除绿色和红色,只保留蓝色。
7、合并颜色
这个和上面的颜色通道提取差不多,就是把提取后的数据再拼接回去,可以自由组合,这里演示的是合并原图片
# '''合并颜色通道'''
# 1. 读取图像
a = cv2.imread('img.png')
# 2. 提取颜色通道
a1 = a[:, :, 0] # 蓝色通道(B通道)
a2 = a[:, :, 1] # 绿色通道(G通道)
a3 = a[:, :, 2] # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道 g 包含绿色通道 r 包含红色通道
# 使用cv2.merge()函数将三个通道重新合并成一个图像
img = cv2.merge((b, g, r))
# img = cv2.merge((a1,a2,a3)) #或者使用这行代码
cv2.imshow('result3', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
8、图片修改
1、图片打码
a = cv2.imread('img.png')
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3)) # 矩阵赋值必须是相同大小
cv2.imshow(winname='masaike', mat=a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()
2、图片组合
这里可以将图片的部分组合起来
a = cv2.imread('img.png')
b = cv2.imread('mm.jpg')
b[200:350, 200:350] = a[50:200, 100:250] # 注意:矩阵的大小必须要统一。
cv2.imshow(winname='b', mat=b)
cv2.imshow(winname='a', mat=a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()
3、图片缩放
# 图片缩放cv2.resize
# 用于调整图像的大小。它有以下几个参数:
# src: 要调整大小的输入图像,可以是numpy数组、PIL图像或其他类型。
# dsize: 输出图像的大小,可以是一个元组,例如(宽, 高), 或者使用整数标量来缩放原始图像。如果dsize为None, 则根据scale
# fx: 沿x轴的缩放系数。
# fy: 沿y轴的缩放系数。
a = cv2.imread('mm.jpg')
a_new = cv2.resize(a, dsize=(200, 600)) # 宽、高
# a_new = cv2.resize(a, dsize=None, fx=1.5, fy=0.5)
# print(a.shape) # 高、宽、通道数
cv2.imshow(winname='a', mat=a)
cv2.imshow(winname='a_new', mat=a_new)
cv2.waitKey(1000000)
cv2.destroyAllWindows()