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

# 读取当前帧图像
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](https://img-blog.csdnimg.cn/463a656eb38540498f8a367a455c8b2a.gif)  
 ![视频编解码2](https://img-blog.csdnimg.cn/ae5e5880a95e49549472c83af282c0b6.png)以下是一个简单的示例代码,演示如何使用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视频处理示例代码


![视频处理](https://img-blog.csdnimg.cn/7ee8026c6ec34fd6a599afcf36fb92e2.jpg)  
 ![视频处理2](https://img-blog.csdnimg.cn/e37443bb0b9c4068ae9716a2fea71569.gif)以下是一个简单的示例代码,演示如何使用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](https://img-blog.csdnimg.cn/a5edbc513619460eb462270405f44dd7.jpg)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b5bfba30372f499bb01abc07c2239e2a.jpg)以下是一个简单的示例代码,演示如何使用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()
文末有福利领取哦~

👉一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。img

👉二、Python必备开发工具

img
👉三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
img

👉 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
img

👉五、Python练习题

检查学习结果。
img

👉六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
img

img

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值