OpenCV 学习笔记
- 逐个API说明
- ✅ 基础IO
- ✅ 图像预处理
- ✅ 绘图函数
- ✅ 可选API
- 常见坑
先安装包
pipinstallopencv-python下面代码依次演示:读视频帧、预处理、高斯模糊、画框、写文字、保存截图、窗口释放。
importcv2# 1. 基础IO:打开视频/相机# cap = cv2.VideoCapture(0) # 0=本地摄像头cap=cv2.VideoCapture("test.mp4")# 读取视频文件;仿真虚拟帧就替换成拿到的画面frame_count=0whilecap.isOpened():ret,frame=cap.read()# ret是否读到画面,frame是图像数组(BGR格式!OpenCV默认BGR)ifnotret: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.86x1,y1,x2,y2=120,80,220,180cv2.rectangle(blur,(x1,y1),(x2,y2),(0,255,0),2)# 绿色框,线宽2cv2.putText(blur,"Target 0.86",(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,255,0),2)# ===== 可选:保存截图 =====ifframe_count%30==0:# 每30帧存一张cv2.imwrite(f"result_{frame_count}.jpg",blur)# 显示画面cv2.imshow("Detection Window",blur)# waitKey:等待按键,27=ESC键退出key=cv2.waitKey(1)&0xFFifkey==27:breakframe_count+=1# 释放资源,关闭窗口(必须写!)cap.release()cv2.destroyAllWindows()逐个API说明
✅ 基础IO
cv2.VideoCapture(source)- source填视频路径 / 摄像头编号;后续对接仿真虚拟相机帧时,这里会替换成接收ThreeJS渲染出的图像数组,不再读本地视频文件
.read()循环取一帧图像,返回(ret,frame)
cv2.imread("xxx.jpg"):读取图片,返回BGR图像数组img=cv2.imread("test.jpg")cv2.imshow("窗口名", img):弹出窗口展示图片cv2.waitKey(delay):等待键盘输入,单位ms;&0xFF适配不同系统,27对应ESCcv2.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)图像旋转矩阵
# 示例:图片中心,旋转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