OpenCV 学习笔记
先安装包
bash
pip install opencv-python
下面代码依次演示:读视频帧、预处理、高斯模糊、画框、写文字、保存截图、窗口释放。
python
import cv2
# 1. 基础IO:打开视频/相机
# cap = cv2.VideoCapture(0) # 0=本地摄像头
cap = cv2.VideoCapture("test.mp4") # 读取视频文件;仿真虚拟帧就替换成拿到的画面
frame_count = 0
while cap.isOpened():
ret, frame = cap.read() # ret是否读到画面,frame是图像数组(BGR格式!OpenCV默认BGR)
if not ret:
break
# ===== 图像预处理 =====
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # BGR转灰度
rgb_img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # BGR转RGB(给YOLO用,YOLO输入是RGB)
resized = cv2.resize(frame, (640,480)) # 缩放,降低YOLO算力消耗
blur = cv2.GaussianBlur(resized, (5,5), 0) # 高斯滤波降噪,核(5,5)
# ===== 绘图函数:画检测框+文字 =====
# 假设检测框坐标 (x1,y1)左上角 (x2,y2)右下角,置信度0.86
x1,y1,x2,y2 = 120,80,220,180
cv2.rectangle(blur, (x1,y1), (x2,y2), (0,255,0), 2) # 绿色框,线宽2
cv2.putText(blur, "Target 0.86", (x1, y1-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2)
# ===== 可选:保存截图 =====
if frame_count % 30 == 0: # 每30帧存一张
cv2.imwrite(f"result_{frame_count}.jpg", blur)
# 显示画面
cv2.imshow("Detection Window", blur)
# waitKey:等待按键,27=ESC键退出
key = cv2.waitKey(1) & 0xFF
if key == 27:
break
frame_count +=1
# 释放资源,关闭窗口(必须写!)
cap.release()
cv2.destroyAllWindows()
逐个API说明
✅ 基础IO
-
cv2.VideoCapture(source)- source填视频路径 / 摄像头编号;后续对接仿真虚拟相机帧时,这里会替换成接收ThreeJS渲染出的图像数组,不再读本地视频文件
.read()循环取一帧图像,返回(ret,frame)
-
cv2.imread("xxx.jpg"):读取图片,返回BGR图像数组pythonimg = cv2.imread("test.jpg") -
cv2.imshow("窗口名", img):弹出窗口展示图片 -
cv2.waitKey(delay):等待键盘输入,单位ms;&0xFF适配不同系统,27对应ESC -
cv2.destroyAllWindows():销毁所有OpenCV窗口,防止后台残留
✅ 图像预处理
-
cv2.cvtColor(img, 转换码)cv2.COLOR_BGR2GRAY:转灰度图cv2.COLOR_BGR2RGB:BGR→RGB,YOLO模型需要RGB输入
⚠️重点坑:OpenCV读出来默认BGR,不是RGB!很多人YOLO检测错乱就是这个原因
-
cv2.resize(img, (width,height))缩放图像,降低推理耗时 -
cv2.GaussianBlur(img, (ksize_x,ksize_y), sigma)(5,5)是卷积核大小,必须是奇数;sigma是高斯标准差,0自动计算- 作用:平滑降噪,减少画面噪点带来的误检测
✅ 绘图函数
cv2.rectangle(img, pt1, pt2, color, thickness)- pt1左上角,pt2右下角;颜色是BGR三元组
(B,G,R),比如绿色(0,255,0)
- pt1左上角,pt2右下角;颜色是BGR三元组
cv2.putText(img, text, 文字左上角坐标, 字体, 字号缩放, 颜色, 线宽)- 用来写:目标类别、置信度、无人机编号UAV1/UGV2,答辩截图很好看
✅ 可选API
cv2.imwrite("save.jpg", img)把图片存硬盘,保存检测结果图放进论文cv2.getRotationMatrix2D(center, angle, scale)图像旋转矩阵
python
# 示例:图片中心,旋转30度,缩放1倍
h,w = frame.shape[:2]
rot_mat = cv2.getRotationMatrix2D((w//2, h//2), 30, 1)
rot_img = cv2.warpAffine(frame, rot_mat, (w,h))
常见坑
- OpenCV图像通道BGR,YOLO需要RGB,忘记转换会检测异常
- 窗口用完不写release+destroyAllWindows,程序卡死
cv2.VideoCapture读仿真帧的时候,如果是内存里的图片数组,不需要VideoCapture,直接用图像数组送入YOLO