第五篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:视频处理

传奇开心果短博文系列

  • 短博文系列目录
    • Python的OpenCV库技术点案例示例短博文系列
  • 博文目录
    • 一、项目目标
    • 二、OpenCV视频处理主要功能介绍
    • 三、OpenCV视频捕捉示例代码
    • 四、OpenCV视频分析示例代码
    • 五、OpenCV视频编解码示例代码
    • 六、OpenCV视频处理示例代码
    • 七、OpenCV视频展示示例代码

短博文系列目录

Python的OpenCV库技术点案例示例短博文系列

博文目录

一、项目目标

视频处理总视频处理:包括视频捕捉、视频分析、视频编解码等功能

二、OpenCV视频处理主要功能介绍

视频处理介绍OpenCV是一个开源计算机视觉库,提供了丰富的功能用于图像和视频处理。下面是关于OpenCV视频处理的一些主要功能介绍:

  1. 视频捕捉(Video Capture):OpenCV可以从摄像头、视频文件或网络摄像头中实时获取视频流,并进行处理。通过使用VideoCapture类,可以方便地打开视频源并读取帧。

  2. 视频分析(Video Analysis):OpenCV提供了多种视频分析算法,例如运动检测、目标跟踪、人脸识别等。这些算法可以帮助我们从视频中提取有用的信息,并进行进一步的处理和分析。

  3. 视频编解码(Video Encoding/Decoding):OpenCV支持多种视频编码和解码格式,包括常见的AVI、MP4、H.264等。通过使用VideoWriter和VideoReader类,可以将图像序列编码为视频文件,或者从视频文件中解码出图像序列。

  4. 视频处理(Video Processing):OpenCV提供了各种视频处理功能,如帧差法背景建模、光流法运动估计、视频平滑滤波等。这些功能可以帮助我们对视频进行降噪、增强、特效处理等。

  5. 视频展示(Video Display):OpenCV可以将处理后的视频展示在屏幕上,也可以保存为新的视频文件。通过使用VideoWriter类,可以将处理后的图像序列写入到视频文件中,并设置编码格式和参数。

总的来说,OpenCV提供了丰富的视频处理功能,可以帮助我们实现视频捕捉、分析、编解码等各种任务。无论是进行实时视频处理还是对已有视频进行处理,OpenCV都是一个强大而灵活的选择。

三、OpenCV视频捕捉示例代码

视频捕捉以下是一个简单的示例代码,演示如何使用OpenCV进行视频捕捉:

import cv2

# 打开视频捕捉设备(摄像头)
cap = cv2.VideoCapture(0)

while True:
    # 读取一帧图像
    ret, frame = cap.read()
    
    # 如果成功读取到帧
    if ret:
        # 在窗口中显示图像
        cv2.imshow('Video Capture', frame)
    
    # 按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放视频捕捉设备
cap.release()

# 关闭所有窗口
cv2.destroyAllWindows()

这段代码首先创建了一个VideoCapture对象,并传入参数0表示打开默认摄像头。然后通过循环不断读取帧,cv2.imshow函数将每一帧图像显示在名为"Video Capture"的窗口中。如果按下键盘上的 ‘q’ 键,就会退出循环。最后,释放视频捕捉设备并关闭所有窗口。

请注意,这只是一个简单示例,实际应用中还需要考虑错误处理、参数设置、图像处理等其他因素。根据实际需求,您可以进一步扩展和优化代码。
当进行视频捕捉时,您可以根据需要进行更多的扩展和优化。以下是一些可能的扩展示例:

  1. 指定视频文件进行捕捉:除了捕捉摄像头的实时视频流,您还可以使用OpenCV捕捉已经录制好的视频文件。只需将视频文件路径作为参数传递给VideoCapture对象即可。
cap = cv2.VideoCapture('path/to/video/file.mp4')
  1. 设置捕捉参数:通过设置VideoCapture对象的参数,您可以调整视频捕捉的帧率、分辨率等。例如,您可以使用cap.set()方法设置帧率为30:
cap.set(cv2.CAP_PROP_FPS, 30)
  1. 图像处理:在捕捉到的每一帧图像上,您可以进行各种图像处理操作,如边缘检测、滤波、目标检测等。这样可以实现更复杂的视频处理任务。
# 在每一帧图像上应用Canny边缘检测算法
edges = cv2.Canny(frame, 100, 200)
cv2.imshow('Edges', edges)
  1. 视频保存:如果您希望将捕捉到的视频保存为新的文件,可以使用VideoWriter对象。首先创建一个VideoWriter对象,指定输出文件名、编码格式、帧率等参数。然后在循环中使用writer.write(frame)将每一帧写入输出文件。
# 创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, 30.0, (640, 480))

# 在循环中将每一帧写入输出文件
while True:
    ret, frame = cap.read()
    if ret:
        out.write(frame)
        cv2.imshow('Video Capture', frame)
    ...

这些扩展和优化可以根据您的具体需求进行调整和组合。OpenCV提供了丰富的功能和接口,您可以根据自己的项目要求进行灵活应用。

四、OpenCV视频分析示例代码

视频分析以下是一个简单的示例代码,演示如何使用OpenCV进行视频分析,以运动检测为例:

import cv2

# 打开视频文件
cap = cv2.VideoCapture('path/to/video/file.mp4')

# 读取第一帧图像作为背景
ret, background = cap.read()

while True:
    # 读取当前帧图像
    ret, frame = cap.read()
    
    # 如果成功读取到帧
    if ret:
        # 计算当前帧与背景之间的差异
        diff = cv2.absdiff(frame, background)
        
        # 将差异图像转换为灰度图像
        gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
        
        # 对灰度图像进行二值化处理
        _, threshold = cv2.threshold(gray, 30, 255, cv2.THRESH_BINARY)
        
        # 对二值化图像进行形态学操作,去除噪声
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
        dilated = cv2.dilate(threshold, kernel, iterations=3)
        
        # 查找并绘制轮廓
        contours, _ = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        cv2.drawContours(frame, contours, -1, (0, 255, 0), 2)
        
        # 在窗口中显示图像
        cv2.imshow('Video Analysis', frame)
    
    # 按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放视频文件
cap.release()

# 关闭所有窗口
cv2.destroyAllWindows()

这段代码首先打开视频文件,并读取第一帧图像作为背景。然后在循环中,不断读取视频的每一帧,并与背景进行比较,计算出差异图像。通过将差异图像转换为灰度图像、二值化处理、形态学操作和轮廓查找,可以实现简单的运动检测。最后,在窗口中显示带有轮廓的当前帧图像。如果按下键盘上的 ‘q’ 键,就会退出循环。最后,释放视频文件并关闭所有窗口。

请注意,这只是一个简单示例,实际应用中还需要考虑错误处理、参数设置、进一步的图像处理等其他因素。根据实际需求,您可以进一步扩展和优化代码。
以下是一个扩展示例代码,演示如何使用OpenCV进行视频分析的一些扩展功能,包括运动目标跟踪和人脸识别:

import cv2

# 打开视频文件
cap = cv2.VideoCapture('path/to/video/file.mp4')

# 创建背景减法器
fgbg = cv2.createBackgroundSubtractorMOG2()

# 创建人脸检测器
face_cascade = cv2.CascadeClassifier('path/to/haarcascade_frontalface_default.xml')

while True:
    # 读取当前帧图像
    ret, frame = cap.read()
    
    # 如果成功读取到帧
    if ret:
        # 应用背景减法器,提取前景
        fgmask = fgbg.apply(frame)
        
        # 运动目标跟踪
        contours, _ = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        for contour in contours:
            if cv2.contourArea(contour) > 500:
                x, y, w, h = cv2.boundingRect(contour)
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        
        # 人脸识别
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
        
        # 在窗口中显示图像
        cv2.imshow('Video Analysis', frame)
    
    # 按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放视频文件
cap.release()

# 关闭所有窗口
cv2.destroyAllWindows()

这段代码在前面的视频分析示例代码基础上进行了扩展。首先创建了一个背景减法器(Background Subtractor),用于提取视频中的前景物体。然后使用该前景进行运动目标跟踪,通过找到轮廓并绘制矩形框来标记运动目标。接下来,使用人脸识别器(Haar级联分类器)对当前帧进行人脸检测,然后绘制矩形框来标记检测到的人脸。

请注意,为了运行人脸识别功能,您需要下载并指定正确的人脸检测器(haarcascade_frontalface_default.xml)。您可以从OpenCV官方网站或GitHub存储库中获取该文件。

这只是一个简单的示例,实际应用中可能需要进一步调整和优化参数、处理多个目标、添加更多的视频分析功能等。根据您的具体需求,您可以根据OpenCV提供的丰富功能和算法进行扩展和定制。

五、OpenCV视频编解码示例代码

视频编解码1
视频编解码2以下是一个简单的示例代码,演示如何使用OpenCV进行视频编解码:

import cv2

# 打开视频文件
cap = cv2.VideoCapture('path/to/video/file.mp4')

# 获取视频的原始宽度和高度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 创建编码器对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, 30.0, (width, height))

while True:
    # 读取当前帧图像
    ret, frame = cap.read()
    
    # 如果成功读取到帧
    if ret:
        # 在窗口中显示图像
        cv2.imshow('Video Playback', frame)
        
        # 将帧写入输出视频文件
        out.write(frame)
    
    # 按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放视频文件和编码器对象
cap.release()
out.release()

# 关闭所有窗口
cv2.destroyAllWindows()

这段代码首先打开视频文件,并获取视频的原始宽度和高度。然后创建一个VideoWriter对象,指定输出文件名、编码格式、帧率和图像大小。在循环中,不断读取视频的每一帧,并在窗口中显示图像。同时,将每一帧写入输出视频文件中。如果按下键盘上的 ‘q’ 键,就会退出循环。最后,释放视频文件和编码器对象,并关闭所有窗口。

请注意,这只是一个简单示例,实际应用中还需要考虑错误处理、参数设置、视频编码参数调整等其他因素。根据实际需求,您可以进一步扩展和优化代码。
以下是一个扩展示例代码,演示如何使用OpenCV进行视频编解码的一些扩展功能,包括视频剪辑和添加音频:

import cv2
import numpy as np

# 打开视频文件
cap = cv2.VideoCapture('path/to/video/file.mp4')

# 获取视频的原始帧率、宽度和高度
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 计算视频总帧数和持续时间
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
duration = total_frames / fps

# 设置剪辑起始时间和结束时间(以秒为单位)
start_time = 10
end_time = 20

# 计算剪辑的起始帧和结束帧
start_frame = int(start_time * fps)
end_frame = int(end_time * fps)

# 调整剪辑后视频的宽度和高度
new_width = int(width / 2)
new_height = int(height / 2)

# 创建编码器对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (new_width, new_height))

# 循环遍历视频帧
for frame_index in range(total_frames):
    # 读取当前帧图像
    ret, frame = cap.read()
    
    # 如果成功读取到帧
    if ret:
        # 对剪辑范围内的帧进行处理
        if frame_index >= start_frame and frame_index <= end_frame:
            # 调整帧的大小
            resized_frame = cv2.resize(frame, (new_width, new_height))
            
            # 在窗口中显示图像
            cv2.imshow('Video Playback', resized_frame)
            
            # 将帧写入输出视频文件
            out.write(resized_frame)
    
    # 按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放视频文件和编码器对象
cap.release()
out.release()

# 关闭所有窗口
cv2.destroyAllWindows()

这段代码在前面的视频编解码示例代码基础上进行了扩展。首先获取视频的原始帧率、宽度和高度,并计算视频的总帧数和持续时间。然后设置剪辑的起始时间和结束时间,并根据帧率计算剪辑的起始帧和结束帧。接下来调整剪辑后视频的宽度和高度,并创建一个新的VideoWriter对象来保存剪辑后的视频。在循环中,只对剪辑范围内的帧进行处理和保存。最后,释放视频文件和编码器对象,并关闭所有窗口。

请注意,这只是一个简单示例,实际应用中可能需要进一步调整和优化参数、处理多个剪辑范围、添加音频等。根据您的具体需求,您可以根据OpenCV提供的丰富功能和算法进行扩展和定制。

六、OpenCV视频处理示例代码

视频处理
视频处理2以下是一个简单的示例代码,演示如何使用OpenCV进行视频处理:

import cv2

# 打开视频文件
cap = cv2.VideoCapture('path/to/video/file.mp4')

# 创建输出视频文件对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, 30.0, (640, 480))

while True:
    # 读取当前帧图像
    ret, frame = cap.read()

    # 如果成功读取到帧
    if ret:
        # 图像处理操作示例:将图像转换为灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 在窗口中显示图像
        cv2.imshow('Video Processing', gray)

        # 将处理后的帧写入输出视频文件
        out.write(gray)

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

# 释放视频文件和输出视频文件对象
cap.release()
out.release()

# 关闭所有窗口
cv2.destroyAllWindows()

这段代码首先打开视频文件,并创建一个输出视频文件对象。然后在循环中,不断读取视频的每一帧。在每一帧中,可以进行各种图像处理操作,例如将图像转换为灰度图像、应用滤波器、检测边缘等。在本示例中,我们将图像转换为灰度图像。然后,在窗口中显示处理后的图像,并将其写入输出视频文件。如果按下键盘上的 ‘q’ 键,就会退出循环。最后,释放视频文件和输出视频文件对象,并关闭所有窗口。

请注意,这只是一个简单示例,实际应用中可以根据需求进行更复杂的图像处理操作,如对象检测、跟踪、特征提取等。您可以根据OpenCV提供的丰富功能和算法进行扩展和定制,以满足您的具体需求。
以下是一个扩展示例代码,演示如何使用OpenCV进行视频处理的一些扩展功能,包括对象检测和添加文本水印:

import cv2

# 打开视频文件
cap = cv2.VideoCapture('path/to/video/file.mp4')

# 创建输出视频文件对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, 30.0, (640, 480))

# 加载对象检测模型
net = cv2.dnn.readNetFromCaffe('path/to/model.prototxt', 'path/to/model.caffemodel')

while True:
    # 读取当前帧图像
    ret, frame = cap.read()

    # 如果成功读取到帧
    if ret:
        # 对象检测操作示例:检测人脸
        blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0, (300, 300), (104.0, 177.0, 123.0))
        net.setInput(blob)
        detections = net.forward()

        # 绘制检测框
        for i in range(detections.shape[2]):
            confidence = detections[0, 0, i, 2]
            if confidence > 0.5:
                box = detections[0, 0, i, 3:7] * np.array([frame.shape[1], frame.shape[0], frame.shape[1], frame.shape[0]])
                (startX, startY, endX, endY) = box.astype("int")
                cv2.rectangle(frame, (startX, startY), (endX, endY), (0, 255, 0), 2)

        # 添加文本水印
        cv2.putText(frame, 'Watermark', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA)

        # 在窗口中显示图像
        cv2.imshow('Video Processing', frame)

        # 将处理后的帧写入输出视频文件
        out.write(frame)

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

# 释放视频文件和输出视频文件对象
cap.release()
out.release()

# 关闭所有窗口
cv2.destroyAllWindows()

这段代码在前面的视频处理示例代码基础上进行了扩展。首先打开视频文件,并创建一个输出视频文件对象。然后加载对象检测模型,例如人脸检测模型。在每一帧中,通过对象检测模型检测出感兴趣的对象,并绘制检测框标记出来。同时,在帧上添加文本水印,以展示添加文本的能力。最后,在窗口中显示处理后的图像,并将其写入输出视频文件。

请注意,这只是一个简单示例,实际应用中可以根据需求使用不同的对象检测模型,如物体检测、行人检测等。您可以根据OpenCV提供的丰富功能和算法进行扩展和定制,以满足您的具体需求。同时,您还可以进一步调整参数、添加其他图像处理操作等,以实现更复杂的视频处理任务。

七、OpenCV视频展示示例代码

视频展示1
在这里插入图片描述以下是一个简单的示例代码,演示如何使用OpenCV展示视频:

import cv2

# 打开视频文件
cap = cv2.VideoCapture('path/to/video/file.mp4')

while True:
    # 读取当前帧图像
    ret, frame = cap.read()

    # 如果成功读取到帧
    if ret:
        # 在窗口中显示图像
        cv2.imshow('Video Playback', frame)

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

# 释放视频文件
cap.release()

# 关闭所有窗口
cv2.destroyAllWindows()

这段代码首先打开视频文件,并在循环中不断读取视频的每一帧。在每一帧中,将图像显示在一个窗口中。如果按下键盘上的 ‘q’ 键,就会退出循环。最后,释放视频文件,并关闭所有窗口。

请注意,这只是一个简单示例,实际应用中可能需要进一步处理和优化,例如调整窗口大小、添加视频控制功能等。根据您的具体需求,您可以根据OpenCV提供的丰富功能和算法进行扩展和定制。
以下是一个扩展示例代码,演示如何使用OpenCV展示视频并实时显示帧率:

import cv2
import time

# 打开视频文件
cap = cv2.VideoCapture('path/to/video/file.mp4')

# 获取视频的帧率
fps = cap.get(cv.CAP_PROP_FPS)

while True:
    # 读取当前帧图像
    ret, frame = cap.read()

    # 如果成功读到帧
    if ret:
        # 在窗口中显示图像
 cv2.imshow('Video Playback', frame)

        # 实时计算帧率
 current_time = time.time()
        elapsed_time = current_time - start_time
        fps_current = 1 / elapsed_time
        start_time = current_time

        # 打印帧率信息
        print(f"当前帧率: {fps_current:.2f} fps")

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

# 释放视频文件
cap.release()

# 关闭所有窗口
cv2.destroyAllWindows()

这段代码在前面的视频展示示例代码基础上进行了扩展。首先打开视频文件,并获取视频的帧率。在循环中,不断读取视频的每一帧,并在窗口中显示图像。同时,通过计算时间差来实时计算帧率,并打印帧率信息。如果按下键盘上的 ‘q’ 键,就会退出循环。最后,释放视频文件,并关闭所有窗口。

请注意,计算帧率的精确性取决于计算时间间隔的准确性。这里使用了简单的时间差来计算帧率,实际应用中可能需要更精确的计时方法。根据您的具体需求,您可以根据OpenCV提供的丰富功能和算法进行扩展和定制。

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

传奇开心果编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值