OpenCV基础操作完全指南(零基础入门)
安装与环境配置
安装命令:pip install opencv-python
导入方式:import cv2
配套工具:import numpy as np
图像基础操作
读取与属性查看
img = cv2.imread('image.jpg', cv2.IMREAD_COLOR)
- 第一个参数:文件路径
- 第二个参数(可选):
- cv2.IMREAD_COLOR:默认三通道BGR格式(注意不是RGB)
- cv2.IMREAD_GRAYSCALE:直接读取为灰度图
- cv2.IMREAD_UNCHANGED:包含Alpha通道的四通道
形状查看:img.shape
返回(高度,宽度,通道数)
数据类型:img.dtype
通常为uint8
像素极值:np.min(img)
与np.max(img)
显示与保存
显示窗口:cv2.imshow('Preview', img)
等待操作:cv2.waitKey(0)
(0表示无限等待)
销毁窗口:cv2.destroyAllWindows()
保存文件:cv2.imwrite('output.png', img)
- 第三个参数(可选):
JPEG质量参数:0-100(默认95)
PNG压缩级别:cv2.IMWRITE_PNG_COMPRESSION
色彩空间转换
BGR↔灰度转换
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
转换公式:0.299*R + 0.587*G + 0.114*B
BGR↔HSV转换
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
应用场景:颜色追踪时定义阈值范围
H:色调(0-180)
S:饱和度(0-255)
V:明度(0-255)
绘图功能精要
基础图形绘制
线段:cv2.line(img, (x1,y1), (x2,y2), (B,G,R), 线宽)
矩形:cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
圆形:cv2.circle(img, (cx,cy), 半径, (0,0,255), -1)
(-1为填充)
文字:cv2.putText(img, 'Text', (x,y), 字体, 字号, (255,0,0), 2)
cv2.ellipse
cv2.polylines
视频处理流程
实时摄像头处理
cap = cv2.VideoCapture(0)
初始化摄像头
while True:
ret, frame = cap.read()
读取帧
cv2.imshow('Live', frame)
显示画面
if cv2.waitKey(1) == 27: break
ESC键退出
资源释放:cap.release()
视频文件输出
编码设置:fourcc = cv2.VideoWriter_fourcc(*'XVID')
写入对象:out = cv2.VideoWriter('output.avi', fourcc, 帧率, (宽,高))
写入帧:out.write(frame)
重要注意事项
颜色通道陷阱
OpenCV使用BGR格式,Matplotlib使用RGB格式,显示前需转换:
display_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
路径与权限问题
读取失败时检查:
- 文件路径是否包含中文/特殊字符
- 文件是否被其他程序占用
- Linux/macOS系统的文件权限设置
内存管理
视频处理必须释放资源:
cap.release()
out.release()
数据类型
所有图像数据都是numpy.ndarray类型:
print(img.shape) # (height, width, channels)
综合应用案例
实时边缘检测实现
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200) # 双阈值边缘检测
cv2.imshow('Edges', edges)`
if cv2.waitKey(1) == 27: break`
九宫格拼图制作
h, w = img.shape[:2]
single_h = h//3 # 垂直分三份
single_w = w//3 # 水平分三份
mosaic = []
for i in range(3):
row = np.hstack([img[i*single_h:(i+1)*single_h, j*single_w:(j+1)*single_w] for j in range(3)])
mosaic.append(row)
final = np.vstack(mosaic)