OpenCV 入门实战:从环境配置到图像 / 视频处理
OpenCV 是计算机视觉领域最常用的开源库之一,它提供了丰富的图像和视频处理功能。本文将从环境配置开始,带大家一步步解析基础操作代码,快速入门 OpenCV 的使用。
一、环境配置
在开始之前,我们需要先搭建好 OpenCV 的运行环境。
1. 安装 Python
OpenCV 支持多种编程语言,其中 Python 接口最为易用。首先确保你的电脑上安装了 Python(推荐 3.7 及以上版本),可以从Python 官网下载安装。
2. 安装 OpenCV 库
打开命令行(Windows 系统可使用 Win+R 输入 cmd,Mac/Linux 使用终端),输入以下命令安装 OpenCV:
pip install opencv-python
如果需要额外的扩展功能(如视频处理相关模块),可以安装:
pip install opencv-contrib-python
二、代码解析:图像基本操作
1. 读取与显示图像
import cv2
# 读取图像(默认以BGR格式读取)
a = cv2.imread('img.png')
# 显示图像,第一个参数是窗口名称,第二个是图像数据
cv2.imshow('cute', a)
# 等待按键(0表示无限等待),返回值是按键的ASCII码
b = cv2.waitKey(0)
# 关闭所有窗口
cv2.destroyAllWindows()
运行结果:
关键说明:
cv2.imread()
:如果路径错误会返回None
,建议使用绝对路径或检查文件是否存在cv2.imshow()
:需要配合cv2.waitKey()
使用,否则窗口会一闪而过cv2.waitKey(0)
:等待用户按下任意键,按下的键值会被返回(如按 ESC 键返回 27)
2. 图像属性查看
print(b) # 输出按下的按键ASCII码
print("图像形状", a.shape) # 输出(高度, 宽度, 通道数),彩色图通道数为3
print("图像数据类型", a.dtype) # 通常为uint8(0-255的整数)
print(f"图像大小:", a.size) # 总像素数 = 高度×宽度×通道数
运行结果:
按下的是'q'返回的是'q'的ASCII码,按下其他的是窗口关闭返回其他按键的ASCII码
3. 灰度图转换
# 以灰度模式读取图像(参数cv2.IMREAD_GRAYSCALE)
b = cv2.imread(r'./img.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow('xx', b)
a = cv2.waitKey(0)
cv2.destroyAllWindows()
# 灰度图的形状是(高度, 宽度),通道数为1
print("图像形状:", b.shape)
print("图像数据类型:", b.dtype)
print("图像大小:", b.size) # 总像素数 = 高度×宽度
- 图像转化为灰度图
- 返回图像属性
4. 图像保存
# 将灰度图保存为新文件
cv2.imwrite('immg.png', b)
产生immg.png图片:
注意:imwrite()
的第一个参数是保存路径,第二个是图像数据,支持 png、jpg 等多种格式。
5. 图像切片(裁剪)
a = cv2.imread(r'./img.png')
# 切片格式:[起始行:结束行, 起始列:结束列](行数对应高度,列数对应宽度)
b_qie = a[30:230, 100:300] # 裁剪从第30行到230行,第100列到300列的区域
cv2.imshow('yuantu', a) # 显示原图
cv2.imshow('qiepian', b_qie) # 显示切片区域
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
三、代码解析:视频处理基础
1. 调用摄像头
import cv2
# 打开摄像头(0表示默认摄像头,也可以传入视频文件路径)
video_caputure = cv2.VideoCapture(0)
if not video_caputure.isOpened():print("无法打开摄像头或文件")exit()
while True:# 读取一帧画面,ret是布尔值表示是否读取成功,frame是帧数据ret, frame = video_caputure.read()if not ret:break # 读取失败则退出循环# 可选:将彩色帧转为灰度帧# frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow('Video', frame)# 每60毫秒检测一次按键,按下ESC键(ASCII码27)退出if cv2.waitKey(60) == 27:break
# 释放摄像头资源
video_caputure.release()
cv2.destroyAllWindows()
运行结果:
- video_caputure = cv2.VideoCapture(0) :括号里也可传入视频地址。
四、代码解析:图像通道操作
OpenCV 读取的彩色图像默认是 BGR 格式(蓝、绿、红),而非常见的 RGB 格式,这一点需要特别注意。
1. 通道分离与显示
import cv2
a = cv2.imread(r'./img.png')
# 直接通过索引获取通道(0=蓝,1=绿,2=红)
a1 = a[:, :, 0] # 蓝色通道
a2 = a[:, :, 1] # 绿色通道
a3 = a[:, :, 2] # 红色通道
# 或使用split函数分离通道
b, g, r = cv2.split(a)
# 分别显示三个通道(单通道图像会以灰度形式显示,值越高越亮)
cv2.imshow('b', b)
cv2.imshow('g', g)
cv2.imshow('r', r)
cv2.waitKey(10000) # 等待10秒
运行结果:
2. 通道修改
a_new = a.copy() # 复制原图,避免修改原图
# 将绿色通道和红色通道设为0,只保留蓝色通道
a_new[:, :, 1] = 0
a_new[:, :, 2] = 0
cv2.imshow('result2', a_new) # 显示纯蓝色图像
cv2.waitKey(10000)
cv2.destroyAllWindows()
运行结果:
五、代码解析:图像编辑进阶
1. 图像涂鸦
-
左侧:a [100:200, 200:300]:选取图像中,
100:200
表示选取图像的行范围(垂直方向)200:300
表示选取图像的列范围(水平方向) 100×100 像素的矩形区域 -
右侧:np.random.randint (0, 256, (100, 100, 3)):
np.random.randint()
生成指定范围的随机整数,0, 256
表示生成 [0, 255] 之间的整数(符合图像像素值范围),(100, 100, 3)
表示生成的数组形状:100 行、100 列、3 个通道(与左侧选取的区域大小完全匹配)生成一个充满随机颜色值的三维数组,模拟彩色图像的像素数
将右侧生成的随机颜色数组,赋值给左侧选取的图像区域,图像中 100:200
行、200:300
列的区域会被随机颜色覆盖
import cv2
import numpy as np
a = cv2.imread(r'img.png')
# 在图像的(100:200行, 200:300列)区域填充随机颜色
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))
cv2.imshow('masaike', a)
cv2.waitKey(1000000) # 长时间等待,方便观察
运行结果:
2. 图像融合(粘贴)
b[200:350, 200:350] = a[50:200, 100:250]:将右侧150×150 的区域复制粘贴给左侧150×150区域
a = cv2.imread('img.png')
b = cv2.imread('longnv.webp')
# 将a的(50:200行, 100:250列)区域粘贴到b的(200:350行, 200:350列)区域
# 注意:两个区域的大小必须一致(150x150)
b[200:350, 200:350] = a[50:200, 100:250]
cv2.imshow('b', b)
cv2.imshow('a', a)
cv2.waitKey(10000)
运行结果:
3. 图像缩放
a = cv2.imread('img.png')
# 将图像缩放到宽度200,高度600(注意参数是(width, height))
a_new = cv2.resize(a, (200, 600))
cv2.imshow('a', a)
cv2.imshow('a_new', a_new)
cv2.waitKey(10000)
cv2.destroyAllWindows()
运行结果:
六、总结
这些操作是 OpenCV 的基础,掌握后可以进一步学习更复杂的功能,如边缘检测、目标识别等。建议大家多动手尝试,修改代码中的参数(如切片范围、缩放尺寸),观察结果变化,加深理解。
如果运行中遇到问题,首先检查文件路径是否正确,其次确认 OpenCV 版本是否兼容(可以通过print(cv2.__version__)
查看版本)。祝大家在计算机视觉的路上越走越远!