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πσ21e2σ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. 调试建议
  1. 使用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()
    
  2. 调整参数时使用轨迹栏:
    cv2.createTrackbar('Threshold1', 'Window', 100, 500, callback_func)
    

注意事项

  1. OpenCV默认使用BGR格式,matplotlib使用RGB,显示时需转换
  2. 处理视频流时注意帧率控制
  3. 复杂操作建议使用NumPy向量化计算加速

通过本教程,您已掌握OpenCV核心功能的实现方法,建议从简单项目开始实践(如证件照背景替换、运动检测等),逐步深入计算机视觉领域。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐