求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 


业务架构设计
4月18-19日 在线直播



基于UML和EA进行系统分析设计
4月25-26日 北京+在线



AI 智能化软件测试方法与实践
5月23-24日 上海+在线
 
追随技术信仰

随时听讲座
每天看新闻
 
 
OpenCV 教程
1. OpenCV 简介
2. OpenCV 安装
3. OpenCV 安装(C++)
4. OpenCV 入门实例
5. OpenCV 基础模块
6. OpenCV 图像处理基础
7. OpenCV 图像基本操作
8. OpenCV 图像算术运算
9. OpenCV 图像阈值处理
10. OpenCV 图像平滑处理
11. OpenCV 图像形态学操作
12. OpenCV 图像边缘检测
13. OpenCV 图像轮廓检测
14. OpenCV 图像直方图
15. OpenCV 视频处理
16. OpenCV 视频目标跟踪
17. OpenCV 视频背景减除
18. OpenCV 人脸检测
 
 
目录
OpenCV 视频处理
20 次浏览
1次  

视频是由一系列连续的图像帧组成的,每一帧都是一幅静态图像。

视频处理的核心就是对这些图像帧进行处理。常见的视频处理任务包括视频读取、视频播放、视频保存、视频帧处理等。

视频处理的应用

  • 视频分析: 通过视频处理技术,可以分析视频中的运动、目标、事件等。

  • 视频增强: 对视频进行去噪、增强、稳定化等处理,提升视频质量。

  • 视频编辑: 对视频进行剪辑、拼接、添加特效等操作。

  • 实时监控: 通过摄像头实时监控场景,并进行目标检测、行为分析等。

OpenCV 提供了 cv2.VideoCapture 和 cv2.VideoWriter 两个类,分别用于视频的读取和写入。此外,OpenCV 还提供了丰富的图像处理函数,可以对视频帧进行各种操作。

视频读取与播放

读取视频文件

要读取视频文件,首先需要创建一个 cv2.VideoCapture 对象,并指定视频文件的路径。

实例

import cv2

# 创建 VideoCapture 对象,读取视频文件
cap = cv2.VideoCapture('example.mp4')

# 检查视频是否成功打开
if not cap.isOpened():
    print("Error: Could not open video.")
    exit()

# 读取视频帧
while True:
    ret, frame = cap.read()
   
    # 如果读取到最后一帧,退出循环
    if not ret:
        break
   
    # 显示当前帧
    cv2.imshow('Video', frame)
   
    # 按下 'q' 键退出
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

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

读取摄像头视频

除了读取视频文件,OpenCV 还可以直接从摄像头读取视频,只需将 cv2.VideoCapture 的参数设置为摄像头的索引(通常为0)即可:

实例

import cv2

# 创建 VideoCapture 对象,读取摄像头视频
cap = cv2.VideoCapture(0)

# 检查摄像头是否成功打开
if not cap.isOpened():
    print("Error: Could not open camera.")
    exit()

# 读取视频帧
while True:
    ret, frame = cap.read()
   
    # 如果读取到最后一帧,退出循环
    if not ret:
        break
   
    # 显示当前帧
    cv2.imshow('Camera', frame)
   
    # 按下 'q' 键退出
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

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

视频帧处理

帧的基本操作

在读取视频帧后,可以对每一帧进行各种图像处理操作。

例如,可以将帧转换为灰度图像:

实例

import cv2

cap = cv2.VideoCapture('example.mp4')

while True:
    ret, frame = cap.read()
   
    if not ret:
        break
   
    # 将帧转换为灰度图像
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
   
    # 显示灰度帧
    cv2.imshow('Gray Video', gray_frame)
   
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

帧的保存

在处理视频帧时,有时需要将处理后的帧保存为新的视频文件。

可以使用 cv2.VideoWriter 类来实现:

实例

import cv2

cap = cv2.VideoCapture('example.mp4')

# 获取视频的帧率和尺寸
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 创建 VideoWriter 对象,保存处理后的视频
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))

while True:
    ret, frame = cap.read()
   
    if not ret:
        break
   
    # 将帧转换为灰度图像
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
   
    # 将灰度帧写入输出视频
    out.write(cv2.cvtColor(gray_frame, cv2.COLOR_GRAY2BGR))
   
    # 显示灰度帧
    cv2.imshow('Gray Video', gray_frame)
   
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

视频处理的高级应用

视频中的物体检测

OpenCV 提供了多种物体检测算法,如 Haar 特征分类器、HOG + SVM 等。

以下是一个使用 Haar 特征分类器进行人脸检测的示例:

实例

import cv2

# 加载 Haar 特征分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

cap = cv2.VideoCapture('example.mp4')

while True:
    ret, frame = cap.read()
   
    if not ret:
        break
   
    # 将帧转换为灰度图像
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
   
    # 检测人脸
    faces = face_cascade.detectMultiScale(gray_frame, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
   
    # 在帧上绘制矩形框标记人脸
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
   
    # 显示带有人脸标记的帧
    cv2.imshow('Face Detection', frame)
   
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

视频中的运动检测

运动检测是视频处理中的一个重要应用。可以通过计算帧之间的差异来检测运动物体。

以下是一个简单的运动检测示例:

实例

import cv2

cap = cv2.VideoCapture('example.mp4')

# 读取第一帧
ret, prev_frame = cap.read()
prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)

while True:
    ret, frame = cap.read()
   
    if not ret:
        break
   
    # 将当前帧转换为灰度图像
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
   
    # 计算当前帧与前一帧的差异
    frame_diff = cv2.absdiff(prev_gray, gray_frame)
   
    # 对差异图像进行二值化处理
    _, thresh = cv2.threshold(frame_diff, 30, 255, cv2.THRESH_BINARY)
   
    # 显示运动检测结果
    cv2.imshow('Motion Detection', thresh)
   
    # 更新前一帧
    prev_gray = gray_frame
   
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

常用函数

cv2.VideoCapture

定义:

cv2.VideoCapture 用于从视频文件或摄像头中捕获视频帧。

语法:

cv2.VideoCapture(source)

参数说明:

  • source: 视频文件路径或摄像头索引(通常为0表示默认摄像头)

实例

import cv2

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

while True:
    ret, frame = cap.read()
    if not ret:
        break
    cv2.imshow('Frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

cv2.VideoWriter

定义:

cv2.VideoWriter 用于将视频帧写入视频文件。

语法:

cv2.VideoWriter(filename, fourcc, fps, frameSize)

参数说明:

  • filename: 输出视频文件名。

  • fourcc: 视频编码器(如 cv2.VideoWriter_fourcc(*'XVID'))。

  • fps: 帧率。

  • frameSize: 帧大小(宽度, 高度)。

实例

import cv2

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    out.write(frame)
    cv2.imshow('Frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

 

cv2.cvtColor

定义:

cv2.cvtColor 用于将图像从一种颜色空间转换为另一种颜色空间。

语法:

cv2.cvtColor(src, code)

参数说明:

  • src: 输入图像。

  • code: 颜色空间转换代码(如 cv2.COLOR_BGR2GRAY)

实例

import cv2

img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray Image', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.resize

定义:

cv2.resize 用于调整图像大小。

语法:

cv2.resize(src, dsize)

参数说明:

  • src: 输入图像。

  • dsize: 输出图像大小(宽度, 高度)。

实例

import cv2

img = cv2.imread('image.jpg')
resized = cv2.resize(img, (320, 240))
cv2.imshow('Resized Image', resized)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.Canny

定义:

cv2.Canny 用于边缘检测。

语法:

cv2.Canny(image, threshold1, threshold2)

参数说明:

  • image: 输入图像。

  • threshold1: 第一个阈值。

  • threshold2: 第二个阈值。

实例

import cv2

img = cv2.imread('image.jpg', 0)
edges = cv2.Canny(img, 100, 200)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.findContours

定义:

cv2.findContours 用于查找图像中的轮廓。

语法:

cv2.findContours(image, mode, method)

参数说明:

  • image: 输入图像。

  • mode: 轮廓检索模式(如 cv2.RETR_TREE)。

  • method: 轮廓近似方法(如 cv2.CHAIN_APPROX_SIMPLE)。

实例

import cv2

img = cv2.imread('image.jpg', 0)
contours, _ = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
cv2.imshow('Contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.drawContours

定义:

cv2.drawContours 用于绘制图像中的轮廓。

语法:

cv2.drawContours(image, contours, contourIdx, color, thickness)

参数说明:

  • image: 输入图像。

  • contours: 轮廓列表。

  • contourIdx: 轮廓索引(-1表示绘制所有轮廓)。

  • color: 轮廓颜色。

  • thickness: 轮廓线宽。

实例

import cv2

img = cv2.imread('image.jpg', 0)
contours, _ = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
cv2.imshow('Contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.putText

定义:

cv2.putText 用于在图像上绘制文本。

语法:

cv2.putText(image, text, org, fontFace, fontScale, color, thickness)

参数说明:

  • image: 输入图像。

  • text: 要绘制的文本。

  • org: 文本左下角坐标。

  • fontFace: 字体类型(如 cv2.FONT_HERSHEY_SIMPLEX)。

  • fontScale: 字体缩放比例。

  • color: 文本颜色。

  • thickness: 文本线宽。

实例

import cv2

img = cv2.imread('image.jpg')
cv2.putText(img, 'Hello, OpenCV!', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
cv2.imshow('Text', img)
cv2.waitKey(0)
cv2.destroyAllWindows()


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



20 次浏览
1次