Python + OpenCV 详细教程
·
Python + OpenCV 从零开始详细教程
1. 环境准备
首先安装必要的库:
pip install opencv-python numpy matplotlib
2. 图像基础操作
(1) 读取与显示图像
import cv2
# 读取图像
image = cv2.imread("path/to/image.jpg") # 替换为实际路径
# 显示图像
cv2.imshow("Original Image", image)
cv2.waitKey(0) # 按任意键关闭窗口
cv2.destroyAllWindows()
(2) 图像属性获取
height, width, channels = image.shape
print(f"图像尺寸: {width}x{height}, 通道数: {channels}")
3. 图像处理技术
(1) 颜色空间转换
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转灰度图
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 转HSV空间
(2) 图像阈值处理
_, binary = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
(3) 边缘检测(Canny算法)
edges = cv2.Canny(gray_image, 100, 200) # 参数调整边缘敏感度
4. 图像几何变换
(1) 缩放与旋转
# 缩放
resized = cv2.resize(image, (new_width, new_height))
# 旋转
rotation_matrix = cv2.getRotationMatrix2D((width/2, height/2), 45, 1) # 旋转45°
rotated = cv2.warpAffine(image, rotation_matrix, (width, height))
(2) 仿射变换
pts1 = np.float32([[50,50], [200,50], [50,200]])
pts2 = np.float32([[10,100], [200,50], [100,250]])
matrix = cv2.getAffineTransform(pts1, pts2)
result = cv2.warpAffine(image, matrix, (width, height))
5. 特征检测
(1) 角点检测(Harris算法)
gray = np.float32(gray_image)
corners = cv2.cornerHarris(gray, 2, 3, 0.04) # 参数可调
image[corners > 0.01 * corners.max()] = [0,0,255] # 标记角点为红色
(2) 人脸检测(Haar级联)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5)
# 绘制检测框
for (x,y,w,h) in faces:
cv2.rectangle(image, (x,y), (x+w,y+h), (255,0,0), 2)
6. 图像滤波
(1) 高斯模糊
blurred = cv2.GaussianBlur(image, (15,15), 0) # 核大小需为奇数
高斯滤波权重计算:
G(x,y)=12πσ2e−x2+y22σ2G(x,y) = \frac{1}{2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}}G(x,y)=2πσ21e−2σ2x2+y2
(2) 中值滤波
median = cv2.medianBlur(image, 5) # 有效去除椒盐噪声
7. 图像保存
cv2.imwrite("processed_image.jpg", image) # 保存处理结果
8. 综合案例:实时摄像头处理
cap = cv2.VideoCapture(0) # 打开摄像头
while True:
ret, frame = cap.read()
if not ret: break
# 实时边缘检测
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
cv2.imshow("Live Edge Detection", edges)
if cv2.waitKey(1) & 0xFF == ord('q'): # 按q退出
break
cap.release()
cv2.destroyAllWindows()
9. 进阶技巧
- 直方图均衡化:增强对比度
equalized = cv2.equalizeHist(gray_image) - 模板匹配:查找特定图案
result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
10. 调试建议
- 使用
matplotlib显示多图对比:import matplotlib.pyplot as plt plt.subplot(121), plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) plt.subplot(122), plt.imshow(edges, cmap='gray') plt.show() - 调整参数时使用轨迹栏:
cv2.createTrackbar('Threshold1', 'Window', 100, 500, callback_func)
注意事项:
- OpenCV默认使用BGR格式,matplotlib使用RGB,显示时需转换
- 处理视频流时注意帧率控制
- 复杂操作建议使用NumPy向量化计算加速
通过本教程,您已掌握OpenCV核心功能的实现方法,建议从简单项目开始实践(如证件照背景替换、运动检测等),逐步深入计算机视觉领域。
更多推荐



所有评论(0)