计算机视觉--opencv(代码详细教程)(一)_OpenCV图像处理教程
在计算机视觉的广袤领域中,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: breakvideo_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()