OpenCV 基础操作实战指南:从图像处理到交互控制
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'):breakelse: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, iyif event == cv2.EVENT_LBUTTONDOWN:# 左键按下:开始绘图,记录起点drawing = Trueix, iy = x, yelif 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 = Falseif 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) & 0xFFif k == ord('q'): # 按q退出breakelif k == ord('m'): # 按m切换模式mode = not modecv2.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) & 0xFFif 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 应用的基础,掌握后可进一步学习图像处理(如滤波、边缘检测)、目标检测等高级功能。实际使用时,需注意函数参数的正确设置(如颜色通道顺序、坐标系统)和资源的及时释放,以避免内存泄漏。