【图像算法 - 12】OpenCV-Python 入门指南:图像视频处理与可视化(代码实战 + 视频教程 + 人脸识别项目讲解)

OpenCV-Python 入门指南:图像视频处理与可视化

【图像算法 - 12】OpenCV-Python 入门指南:图像视频处理与可视化(代码实战 + 视频分析 + 人脸识别项目讲解)

OpenCV(Open Source Computer Vision Library)是一个强大的开源计算机视觉库,广泛应用于图像处理、计算机视觉和机器学习领域。本文将介绍 OpenCV-Python 的基础操作,包括图像读取、视频处理、摄像头捕获以及常见的可视化操作,帮助你快速入门。

环境准备

首先确保你已安装 OpenCV-Python 库:

bash 复制代码
pip install opencv-python
# 如需额外功能可安装 contrib 版本
pip install opencv-python-contrib

我们还会用到 numpy 进行数组操作,通常 OpenCV 会自动依赖安装。

图像读取与显示

读取和显示图像是最基础的操作,OpenCV 提供了简单直观的接口:

python 复制代码
import cv2
import numpy as np

# 读取图像
# 注意:OpenCV默认以BGR格式读取图像,而不是RGB
image = cv2.imread('image.jpg')

# 检查图像是否成功读取
if image is None:
    print("无法读取图像,请检查文件路径")
else:
    # 获取图像属性
    height, width, channels = image.shape
    print(f"图像尺寸: {width}x{height}, 通道数: {channels}")
    
    # 显示图像
    cv2.imshow('Original Image', image)
    
    # 等待用户按键 (0表示无限等待)
    cv2.waitKey(0)
    
    # 保存图像
    cv2.imwrite('saved_image.jpg', image)
    
    # 关闭所有窗口
    cv2.destroyAllWindows()

结果展示

bash 复制代码
图像尺寸: 800x534, 通道数: 3

视频读取与处理

OpenCV 可以轻松处理视频文件,无论是读取本地视频还是处理实时视频流:

python 复制代码
import cv2

# 打开视频文件
video = cv2.VideoCapture('video.mp4')

# 检查视频是否成功打开
if not video.isOpened():
    print("无法打开视频文件")
else:
    # 获取视频属性
    fps = video.get(cv2.CAP_PROP_FPS)
    width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
    frame_count = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
    
    print(f"视频属性: {width}x{height}, FPS: {fps}, 总帧数: {frame_count}")
    
    # 循环读取视频帧
    while True:
        # 读取一帧
        ret, frame = video.read()
        
        # 如果读取失败,退出循环
        if not ret:
            break
        
        # 转换为灰度图
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        
        # 显示处理前后的帧
        cv2.imshow('Original Frame', frame)
        cv2.imshow('Gray Frame', gray_frame)
        
        # 按 'q' 键退出
        if cv2.waitKey(25) & 0xFF == ord('q'):
            break
    
    # 释放资源
    video.release()
    cv2.destroyAllWindows()

结果展示

摄像头实时捕获

除了处理视频文件,OpenCV 还能直接从摄像头捕获实时视频:

python 复制代码
import cv2

# 打开摄像头,0表示默认摄像头
cap = cv2.VideoCapture(0)

# 检查摄像头是否成功打开
if not cap.isOpened():
    print("无法打开摄像头")
else:
    while True:
        # 读取一帧
        ret, frame = cap.read()
        
        if not ret:
            print("无法接收帧 (stream end?). 退出...")
            break
        
        # 水平翻转,使显示更自然(像镜子一样)
        frame = cv2.flip(frame, 1)
        
        # 在帧上绘制文本
        cv2.putText(frame, 'Press Q to exit', (10, 30), 
                   cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
        
        # 显示帧
        cv2.imshow('Camera Feed', frame)
        
        # 按 'q' 键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    # 释放资源
    cap.release()
    cv2.destroyAllWindows()

常见图像处理操作

OpenCV 提供了丰富的图像处理函数,以下是一些常用操作:

python 复制代码
import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg')

if image is None:
    print("无法读取图像")
else:
    # 1. 转换为灰度图
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 2. 高斯模糊
    blurred = cv2.GaussianBlur(image, (15, 15), 0)
    
    # 3. 边缘检测
    edges = cv2.Canny(gray, 50, 150)
    
    # 4. 图像缩放
    scaled = cv2.resize(image, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
    
    # 5. 图像旋转
    rows, cols = image.shape[:2]
    M = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1)
    rotated = cv2.warpAffine(image, M, (cols, rows))
    
    # 6. 阈值处理
    _, thresholded = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    
    # 显示所有结果
    cv2.imshow('Original', image)
    cv2.imshow('Gray', gray)
    cv2.imshow('Blurred', blurred)
    cv2.imshow('Edges', edges)
    cv2.imshow('Scaled', scaled)
    cv2.imshow('Rotated', rotated)
    cv2.imshow('Thresholded', thresholded)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

结果展示

可视化操作:画框与添加文字

在图像处理和计算机视觉任务中,经常需要在图像上绘制形状或添加文字来标记感兴趣的区域:

python 复制代码
import cv2
import numpy as np

# 创建一个黑色图像
image = np.zeros((500, 800, 3), np.uint8)

# 1. 绘制直线
cv2.line(image, (50, 50), (750, 50), (0, 255, 0), 3)

# 2. 绘制矩形
cv2.rectangle(image, (100, 100), (300, 300), (0, 0, 255), 2)

# 3. 绘制圆形
cv2.circle(image, (600, 200), 80, (255, 0, 0), -1)  # -1 表示填充

# 4. 绘制椭圆
cv2.ellipse(image, (400, 400), (100, 50), 0, 0, 360, (255, 255, 0), 2)

# 5. 添加文字
cv2.putText(image, 'OpenCV 绘图示例', (150, 450), 
           cv2.FONT_HERSHEY_COMPLEX, 1.2, (0, 255, 255), 2)

# 6. 绘制多边形
pts = np.array([[500, 100], [600, 50], [700, 100], [650, 200], [550, 200]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(image, [pts], True, (255, 0, 255), 2)

# 显示结果
cv2.imshow('Drawing Example', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果展示

综合示例:实时人脸检测

结合以上知识,我们来实现一个实时人脸检测的示例:

python 复制代码
import cv2

# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 打开摄像头
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("无法打开摄像头")
else:
    while True:
        # 读取一帧
        ret, frame = cap.read()
        if not ret:
            break
        
        # 水平翻转
        frame = cv2.flip(frame, 1)
        
        # 转换为灰度图,提高检测效率
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        
        # 检测人脸
        faces = face_cascade.detectMultiScale(gray, 1.1, 4)
        
        # 绘制人脸框并添加文字
        for (x, y, w, h) in faces:
            # 绘制矩形框
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
            # 添加文字标签
            cv2.putText(frame, 'Face', (x, y-10), 
                       cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
        
        # 显示帧率信息
        cv2.putText(frame, 'Press Q to exit', (10, 30), 
                   cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
        
        # 显示结果
        cv2.imshow('Face Detection', frame)
        
        # 按 'q' 键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    # 释放资源
    cap.release()
    cv2.destroyAllWindows()

综合示例:实时人脸检测(带高斯模糊版本)

python 复制代码
import cv2

# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 打开摄像头
cap = cv2.VideoCapture('videoplayback.mp4')

if not cap.isOpened():
    print("无法打开摄像头")
else:
    while True:
        # 读取一帧
        ret, frame = cap.read()
        frame = cv2.resize(frame,(640,480))
        if not ret:
            break

        # 水平翻转
        frame = cv2.flip(frame, 1)

        # 转换为灰度图,提高检测效率
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 检测人脸
        faces = face_cascade.detectMultiScale(gray, 1.1, 4)



        # 绘制人脸框并添加文字
        for (x, y, w, h) in faces:
            # 绘制矩形框
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
            # 添加文字标签
            cv2.putText(frame, 'Face', (x, y - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

            # 提取ROI
            roi = frame[y:y + h, x:x + w]

            # 对ROI应用高斯模糊
            blurred_roi = cv2.GaussianBlur(roi, (55, 55), 0)

            # 将模糊后的ROI放回原图
           # image_with_blurred_roi = frame.copy()
            frame[y:y + h, x:x + w] = blurred_roi

        # 显示帧率信息
        cv2.putText(frame, 'Press Q to exit', (10, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)

        # 显示结果
        cv2.imshow('Face Detection', frame)

        # 按 'q' 键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # 释放资源
    cap.release()
    cv2.destroyAllWindows()

总结与注意事项

  1. 颜色空间:OpenCV 默认使用 BGR 颜色空间,而其他库(如 Matplotlib)通常使用 RGB,在转换库时需要注意颜色通道的转换。
  2. 中文显示:OpenCV 的 putText 函数对中文支持不佳,如需显示中文,可以结合 PIL 库进行处理。
  3. 性能优化:处理视频或实时流时,可适当降低分辨率或使用灰度图来提高处理速度。
  4. 错误处理:始终检查文件是否成功打开、图像是否成功读取,这能帮你避免很多常见错误。

OpenCV 是一个功能极其丰富的库,本文仅介绍了基础操作。要深入学习,可以探索其在特征检测、目标跟踪、图像分割、机器学习集成等方面的高级功能。通过不断实践,你将能够利用 OpenCV 解决各种计算机视觉问题。

相关推荐
一株月见草哇2 小时前
Matlab(4)
人工智能·算法·matlab
IMER SIMPLE3 小时前
人工智能-python-机器学习-线性回归与梯度下降:理论与实践
人工智能·python·机器学习
hans汉斯3 小时前
基于深度学习的苹果品质智能检测算法研究
人工智能·深度学习·算法
2401_831896033 小时前
深度学习(5):激活函数
人工智能·深度学习
mit6.8243 小时前
[Robotics_py] 机器人运动模型 | `update`函数 | 微积分&矩阵
人工智能·python·算法
有才不一定有德3 小时前
GPT-5 提示词指南核心技巧总结
人工智能·chatgpt·开源
一枝小雨3 小时前
opencv:直方图
人工智能·python·opencv·计算机视觉
deephub4 小时前
Dots.ocr:告别复杂多模块架构,1.7B参数单一模型统一处理所有OCR任务22
人工智能·深度学习·神经网络·ocr
蒋星熠4 小时前
Rust 异步生态实战:Tokio 调度、Pin/Unpin 与零拷贝 I/O
人工智能·后端·python·深度学习·rust