【图像算法 - 12】OpenCV-Python 入门指南:图像视频处理与可视化(代码实战 + 视频教程 + 人脸识别项目讲解)
OpenCV-Python 入门指南:图像视频处理与可视化
【图像算法 - 12】OpenCV-Python 入门指南:图像视频处理与可视化(代码实战 + 视频分析 + 人脸识别项目讲解)
OpenCV(Open Source Computer Vision Library)是一个强大的开源计算机视觉库,广泛应用于图像处理、计算机视觉和机器学习领域。本文将介绍 OpenCV-Python 的基础操作,包括图像读取、视频处理、摄像头捕获以及常见的可视化操作,帮助你快速入门。
环境准备
首先确保你已安装 OpenCV-Python 库:
pip install opencv-python
# 如需额外功能可安装 contrib 版本
pip install opencv-python-contrib
我们还会用到 numpy 进行数组操作,通常 OpenCV 会自动依赖安装。
图像读取与显示
读取和显示图像是最基础的操作,OpenCV 提供了简单直观的接口:
import cv2
import numpy as np# 读取图像
# 注意:OpenCV默认以BGR格式读取图像,而不是RGB
image = cv2.imread('image.jpg')# 检查图像是否成功读取
if image is None:print("无法读取图像,请检查文件路径")
else:# 获取图像属性height, width, channels = image.shapeprint(f"图像尺寸: {width}x{height}, 通道数: {channels}")# 显示图像cv2.imshow('Original Image', image)# 等待用户按键 (0表示无限等待)cv2.waitKey(0)# 保存图像cv2.imwrite('saved_image.jpg', image)# 关闭所有窗口cv2.destroyAllWindows()
结果展示
图像尺寸: 800x534, 通道数: 3
视频读取与处理
OpenCV 可以轻松处理视频文件,无论是读取本地视频还是处理实时视频流:
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 还能直接从摄像头捕获实时视频:
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 提供了丰富的图像处理函数,以下是一些常用操作:
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()
结果展示
可视化操作:画框与添加文字
在图像处理和计算机视觉任务中,经常需要在图像上绘制形状或添加文字来标记感兴趣的区域:
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()
结果展示
综合示例:实时人脸检测
结合以上知识,我们来实现一个实时人脸检测的示例:
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()
综合示例:实时人脸检测(带高斯模糊版本)
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)# 提取ROIroi = 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()
总结与注意事项
- 颜色空间:OpenCV 默认使用 BGR 颜色空间,而其他库(如 Matplotlib)通常使用 RGB,在转换库时需要注意颜色通道的转换。
- 中文显示:OpenCV 的 putText 函数对中文支持不佳,如需显示中文,可以结合 PIL 库进行处理。
- 性能优化:处理视频或实时流时,可适当降低分辨率或使用灰度图来提高处理速度。
- 错误处理:始终检查文件是否成功打开、图像是否成功读取,这能帮你避免很多常见错误。
OpenCV 是一个功能极其丰富的库,本文仅介绍了基础操作。要深入学习,可以探索其在特征检测、目标跟踪、图像分割、机器学习集成等方面的高级功能。通过不断实践,你将能够利用 OpenCV 解决各种计算机视觉问题。