OpenCV(Open Source Computer Vision Library)是一个强大的计算机视觉库,广泛应用于图像处理、视频分析等领域。本文将通过实战代码解析,带你掌握 OpenCV 的核心基础操作,包括图像读写、视频处理、图形绘制、鼠标交互和轨迹栏控制等关键技能。
一、图像基本操作:读取、显示与保存
图像操作是 OpenCV 的基础,以下代码展示了如何读取灰度图像、显示图像,并通过按键交互实现窗口关闭和图像保存功能。
import cv2
import numpy as np
# 读取图像,0表示以灰度模式读取
img = cv2.imread("1.jpg", 0)
# 显示图像,第一个参数是窗口名称,第二个是图像数据
cv2.imshow('test', img)
# 等待按键输入,0表示无限等待
key = cv2.waitKey(0)
# 按键判断(注意:waitKey返回ASCII码,需用ord()转换)
if key == ord('q'): # 按q键关闭窗口
cv2.destroyAllWindows()
if key == ord('s'): # 按s键保存图像
cv2.imwrite('2.jpg', img)
关键函数解析:
cv2.imread(path, flag)
:读取图像,flag=0
为灰度图,flag=1
为彩色图(默认)cv2.imshow(window_name, img)
:创建窗口并显示图像cv2.waitKey(delay)
:等待按键事件,delay=0
表示无限等待,返回按键 ASCII 码cv2.imwrite(path, img)
:保存图像到指定路径cv2.destroyAllWindows()
:关闭所有 OpenCV 创建的窗口
二、结合 Matplotlib 显示图像
除了 OpenCV 自带的显示功能,还可以结合 Matplotlib 库展示图像,适合需要更丰富绘图功能的场景。
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 读取灰度图像
img = cv2.imread('ocv01.jpg', 0)
# 使用matplotlib显示,cmap='gray'确保灰度图正确显示
plt.imshow(img, cmap='gray', interpolation='bicubic')
# 隐藏坐标轴刻度
plt.xticks([]), plt.yticks([])
# 显示图像
plt.show()
注意事项:
- OpenCV 读取的彩色图像默认是 BGR 格式,而 Matplotlib 使用 RGB 格式,若显示彩色图需先转换:
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
interpolation
参数控制插值方式,bicubic
(双三次插值)可获得更平滑的显示效果
三、视频处理:捕获与保存
OpenCV 不仅能处理图像,还能直接操作视频流(包括摄像头和视频文件)。
1. 实时摄像头捕获
import cv2
import numpy as np
# 打开摄像头,0表示默认摄像头
cap = cv2.VideoCapture(0)
while(True):
# 读取一帧图像,ret表示是否成功,frame是图像数据
ret, frame = cap.read()
# 显示帧
cv2.imshow('frame', frame)
# 按q键退出循环(waitKey(1)表示等待1ms)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
2. 视频保存
import cv2
import numpy as np
# 打开摄像头
cap = cv2.VideoCapture(0)
# 定义编码器,'XVID'是常用的视频编码格式
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 创建视频写入对象:输出路径、编码器、帧率、分辨率
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
# 翻转帧(0表示上下翻转)
frame = cv2.flip(frame, 0)
# 写入帧
out.write(frame)
# 显示帧
cv2.imshow('frame', frame)
# 按q键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
核心概念:
cv2.VideoCapture()
:用于打开视频源(摄像头 ID 或视频文件路径)fourcc
:四字符代码,指定视频编码器(如 'XVID'、'MP4V' 等)cv2.VideoWriter()
:视频写入对象,需指定输出路径、编码器、帧率和分辨率
四、图形绘制:在图像上绘制基本形状
OpenCV 提供了丰富的绘图函数,可在图像上绘制直线、矩形、圆等基本图形。
import cv2
import numpy as np
# 创建512x512的黑色画布(3通道彩色图)
img = np.zeros((512, 512, 3), np.uint8)
# 绘制直线:起点(0,0),终点(511,511),颜色(255,0,0)(蓝色),线宽5
cv2.line(img, (0,0), (511,511), (255,0,0), 5)
# 绘制矩形:左上角(384,0),右下角(510,128),颜色(0,255,0)(绿色),线宽3
cv2.rectangle(img, (384,0), (510,128), (0,255,0), 3)
# 绘制圆:圆心(447,63),半径63,颜色(0,0,255)(红色),-1表示填充
cv2.circle(img, (447,63), 63, (0,0,255), -1)
# 绘制椭圆:中心(256,256),长轴100,短轴50,旋转角0,起始角0,结束角180,颜色255,填充
cv2.ellipse(img, (256,256), (100,50), 0, 0, 180, 255, -1)
# 绘制文字:内容'OpenCV',位置(10,500),字体,大小1,颜色白色,线宽2,抗锯齿
cv2.putText(img, 'OpenCV', (10,500), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2, cv2.LINE_AA)
# 显示绘制结果
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
颜色表示:OpenCV 中颜色以 (B, G, R) 格式表示,如(255,0,0)
表示蓝色。
五、鼠标交互:通过鼠标事件绘制图形
OpenCV 支持鼠标事件监听,可实现交互式绘图功能。
import cv2
import numpy as np
# 全局变量:绘图状态、模式(矩形/圆形)、起点坐标
drawing = False # 是否正在绘图
mode = True # True:矩形,False:圆形
ix, iy = -1, -1 # 起点坐标
# 鼠标回调函数
def draw_circle_extensive(event, x, y, flags, param):
global drawing, mode, ix, iy
if event == cv2.EVENT_LBUTTONDOWN:
# 左键按下:开始绘图,记录起点
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
# 鼠标移动:如果正在绘图,根据模式绘制
if drawing == True:
if mode == True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1) # 矩形
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1) # 圆形
elif event == cv2.EVENT_LBUTTONUP:
# 左键释放:结束绘图,完成最终绘制
drawing = False
if mode == True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
# 创建黑色画布
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
# 设置鼠标回调函数
cv2.setMouseCallback('image', draw_circle_extensive)
while(1):
cv2.imshow('image', img)
k = cv2.waitKey(20) & 0xFF
if k == ord('q'): # 按q退出
break
elif k == ord('m'): # 按m切换模式
mode = not mode
cv2.destroyAllWindows()
常用鼠标事件:
EVENT_LBUTTONDOWN
:左键按下EVENT_MOUSEMOVE
:鼠标移动EVENT_LBUTTONUP
:左键释放EVENT_LBUTTONDBLCLK
:左键双击
六、轨迹栏控制:通过滑动条交互调整参数
轨迹栏(Trackbar)是 OpenCV 的另一种交互方式,可用于实时调整参数。
import cv2
import numpy as np
# 创建黑色画布
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
# 创建轨迹栏:名称、窗口名、最小值、最大值、回调函数
cv2.createTrackbar('B', 'image', 0, 255, lambda x: None)
cv2.createTrackbar('G', 'image', 0, 255, lambda x: None)
cv2.createTrackbar('R', 'image', 0, 255, lambda x: None)
# 创建开关轨迹栏
switch = '0 : OFF \n1 : ON'
cv2.createTrackbar(switch, 'image', 0, 1, lambda x: None)
while(1):
cv2.imshow('image', img)
k = cv2.waitKey(1) & 0xFF
if k == 27: # 按ESC退出
break
# 获取轨迹栏当前值
r = cv2.getTrackbarPos('R', 'image')
g = cv2.getTrackbarPos('G', 'image')
b = cv2.getTrackbarPos('B', 'image')
s = cv2.getTrackbarPos(switch, 'image')
# 根据开关状态设置图像颜色
if s == 0:
img[:] = 0 # 关闭状态:黑色
else:
img[:] = [b, g, r] # 打开状态:设置为轨迹栏指定的颜色
cv2.destroyAllWindows()
轨迹栏工作流程:
cv2.createTrackbar()
创建轨迹栏cv2.getTrackbarPos()
获取当前值- 在循环中实时更新图像,实现参数调整的可视化反馈
总结
本文通过 7 个实战案例,系统介绍了 OpenCV 的核心基础操作,包括:
- 图像的读取、显示与保存
- 结合 Matplotlib 展示图像
- 视频的捕获与保存
- 基本图形的绘制
- 鼠标交互绘图
- 轨迹栏参数控制
这些操作是 OpenCV 应用的基础,掌握后可进一步学习图像处理(如滤波、边缘检测)、目标检测等高级功能。实际使用时,需注意函数参数的正确设置(如颜色通道顺序、坐标系统)和资源的及时释放,以避免内存泄漏。