OpenCV 教程(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在计算机视觉领域,OpenCV 教程是通往技术应用的一把钥匙。无论是开发智能安防系统、分析医学影像,还是构建增强现实应用,OpenCV 都是开发者最常用的工具之一。对于编程初学者和中级开发者而言,掌握 OpenCV 的核心功能与实战技巧,能够显著提升在图像处理、视频分析等领域的竞争力。本文将通过循序渐进的讲解,结合代码示例和实际案例,帮助读者系统性地理解 OpenCV 的基础知识与应用场景。


安装与环境配置

安装步骤

在开始学习之前,首先需要安装 OpenCV 库。以下是基于 Python 环境的安装流程:

  1. 安装 Python:确保已安装 Python 3.x(推荐版本 3.8 或更高)。
  2. 安装 OpenCV:通过 pip 命令安装:
    pip install opencv-python  
    pip install opencv-contrib-python  
    

    其中,opencv-contrib-python 包含额外的算法模块,如 SIFT、SURF 等。

验证安装

安装完成后,可以通过以下代码验证 OpenCV 是否可用:

import cv2  
print(cv2.__version__)  

如果输出版本号(如 4.9.0),则安装成功。


基础图像处理操作

图像的读取、显示与保存

读取图像

使用 cv2.imread() 函数加载图像文件:

image = cv2.imread("path/to/image.jpg")  

参数 cv2.IMREAD_COLOR(默认)表示读取彩色图像,cv2.IMREAD_GRAYSCALE 表示读取灰度图像。

显示图像

通过 cv2.imshow() 展示图像窗口:

cv2.imshow("Image Window", image)  
cv2.waitKey(0)  # 等待用户按键关闭窗口  
cv2.destroyAllWindows()  

保存图像

使用 cv2.imwrite() 保存处理后的图像:

cv2.imwrite("output_image.jpg", processed_image)  

图像属性与像素操作

获取图像属性

图像的基本属性包括尺寸、通道数和数据类型:

height, width, channels = image.shape  
pixel_value = image[100, 200]  # 获取坐标 (100,200) 的像素值  

像素修改示例

image[0:50, 0:50] = [0, 0, 255]  # BGR 格式  

核心图像处理技术

图像滤波与去噪

均值滤波

均值滤波通过计算邻域像素的平均值来平滑图像:

blurred = cv2.blur(image, (5, 5))  # (5,5) 是核大小  

比喻:这就像用毛笔在画布上轻轻涂抹,模糊了局部细节,但保留了整体轮廓。

高斯滤波

高斯滤波通过加权平均减少噪声:

gaussian_blur = cv2.GaussianBlur(image, (5, 5), 0)  

边缘检测

Canny 算子

Canny 算子通过多阶段处理检测边缘:

edges = cv2.Canny(image, 100, 200)  # 100 和 200 是阈值参数  

案例:对一张照片应用 Canny 边缘检测,可以清晰看到物体的轮廓线。

形态学操作

膨胀与腐蚀

kernel = np.ones((3,3), np.uint8)  
dilation = cv2.dilate(edges, kernel, iterations=1)  # 膨胀  
erosion = cv2.erode(dilation, kernel, iterations=1)  # 腐蚀  

比喻:膨胀像用橡皮擦扩大目标区域,腐蚀则像用细笔缩小目标区域。


视频与实时处理

读取视频流

cap = cv2.VideoCapture("video.mp4")  # 或使用 0 表示摄像头  
while True:  
    ret, frame = cap.read()  
    if not ret:  
        break  
    cv2.imshow("Video", frame)  
    if cv2.waitKey(25) & 0xFF == ord('q'):  
        break  
cap.release()  
cv2.destroyAllWindows()  

实时边缘检测

while True:  
    ret, frame = cap.read()  
    edges = cv2.Canny(frame, 100, 200)  
    cv2.imshow("Edges", edges)  
    if cv2.waitKey(25) & 0xFF == ord('q'):  
        break  

实战案例:车牌识别

步骤分解

  1. 预处理:灰度化、高斯模糊、边缘检测。
  2. 轮廓检测:寻找矩形轮廓(车牌形状)。
  3. OCR 识别:结合 Tesseract 等工具提取文字。

代码示例

import cv2  
import numpy as np  

def detect_license_plate(image):  
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  
    blurred = cv2.GaussianBlur(gray, (5,5), 0)  
    edges = cv2.Canny(blurred, 50, 150)  

    contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  
    for cnt in contours:  
        approx = cv2.approxPolyDP(cnt, 0.02*cv2.arcLength(cnt, True), True)  
        if len(approx) == 4:  # 车牌通常是四边形  
            cv2.drawContours(image, [approx], 0, (0,255,0), 3)  
    return image  

img = cv2.imread("car.jpg")  
result = detect_license_plate(img)  
cv2.imshow("Result", result)  
cv2.waitKey(0)  

进阶技术:人脸检测与对象跟踪

级联分类器(人脸检测)

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')  
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  
faces = face_cascade.detectMultiScale(gray, 1.1, 4)  
for (x,y,w,h) in faces:  
    cv2.rectangle(image, (x,y), (x+w, y+h), (255,0,0), 2)  

光流法跟踪

prev_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)  
hsv = np.zeros_like(old_frame)  
hsv[...,1] = 255  

while True:  
    ret, frame = cap.read()  
    next_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  
    flow = cv2.calcOpticalFlowFarneback(prev_gray, next_gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)  
    # 处理光流向量...  
    prev_gray = next_gray  

性能优化与调试技巧

矢量化操作

避免使用 for 循环遍历像素,改用 OpenCV 的内置函数。例如:

for i in range(height):  
    for j in range(width):  
        pixel = image[i,j]  

image = image * 0.5  # 直接对矩阵运算  

调试与可视化

  • 使用 cv2.imshow() 分阶段验证每一步结果。
  • 通过 cv2.imwrite() 保存中间图像,分析处理效果。

结论

OpenCV 教程的学习是一个循序渐进的过程。从基础的图像读写到复杂的对象检测,每个技术点都像拼图的一块,最终构建出完整的计算机视觉能力。本文通过代码示例、案例分析和直观比喻,帮助读者理解核心概念。建议读者在学习时:

  1. 动手实践:尝试修改代码参数,观察效果变化。
  2. 结合项目:将技术点应用于实际问题(如智能家居、工业检测)。
  3. 持续学习:关注 OpenCV 官方文档和社区更新,探索更多高级功能。

掌握 OpenCV 不仅能提升技术硬实力,还能为未来探索 AI、机器学习等领域打下坚实的基础。希望本文能成为你探索计算机视觉旅程中的第一步!

最新发布