【python】《多媒体技术与应用》实验报告「数字视频处理」

451 阅读7分钟

​本文已参与「新人创作礼」活动,一起开启掘金创作之路。

****《多媒体技术与应用》****实验报告

实验名称

数字视频处理

实验时间

2022/4/25

姓名

班级

计非201

学号

成绩

  • 实验目的

1.理解并掌握数字视频的相关概念;

2.掌握并利用 Python 读取和观察视频数据;

3.掌握利用 Python 提取和处理视频帧。

二.实验原理

视频(Video)泛指将一系列静态影像以电信号的方式加以捕捉、记录、处理、储存、

传送与重现的各种技术。连续的图像变化每秒超过 24 帧(

frame)画面以上时,根据视觉暂

留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫

做视频。视频技术最早是为了电视系统而发展,但现在已经发展为各种不同的格式以利消费

者将视频记录下来。网络技术的发达也促使视频的纪录片段以串流媒体的形式存在于因特网

之上并可被电脑接收与播放。视频与电影属于不同的技术,后者是利用照相术将动态的影像

捕捉为一系列的静态照片。

数字视频则是将视频信号经过采样、量化和压缩编码等转换成数字视频文件并以文件的

形式存储在计算机中。

数字视频的视频源有很多,如来自于摄像机、录像机、影碟机等视频源的信号,包括从

家用级到专业级、广播级的多种素材。还有计算机软件生成的图形、图像和连续的画面等。

高质量的原始素材是获得高质量最终视频产品的基础。

然后是可以对模拟视频信号进行采集、量化和编码的设备,这一般都由专门的视频采集

卡来完成;对视频信号的采集,尤其是动态视频信号的采集需要很大的存储空间和数据传输

速度。这就需要在采集和播放过程中对图像进行压缩和解压缩处理,一般都采用我们在前面

讲过的压缩方法,不过是利用硬件进行压缩。大多使用的是带有压缩芯片的视频采集卡上。

最后,由多媒体计算机接收和记录编码后的数字视频数据。在这一过程中起主要作用的

是视频采集卡,它不仅提供接口以连接模拟视频设备和计算机,而且具有把模拟信号转换成

数字数据的功能。

三.实验内容与关键步骤

1. 读取素材视频,获取视频的参数,如分辨率,帧速率和总帧数等;

2. 提取素材视频的第 1 帧,第 10 帧,最后一帧,并存储为 JPG 格式的图片;

3. 提取素材视频中的前 5 帧,并存储为 JPG 格式的图片;

4. 求视频的帧差;

5. 计算视频帧速率

6. 计算视频总帧率

7. 提取视频帧

四.代码

1. 读取素材视频,获取视频的参数,如分辨率,帧速率和总帧数

from cv2 import cv2


def get_source_info_opencv(source_name):
    return_value = 0
    try:
        cap = cv2.VideoCapture(source_name)
        width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
        height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
        fps = cap.get(cv2.CAP_PROP_FPS)
        num_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
        print("width:{} \nheight:{} \nfps:{} \nnum_frames:{}".format(width, height, fps, num_frames))
    except (OSError, TypeError, ValueError, KeyError, SyntaxError) as e:
        print("init_source:{} error. {}\n".format(source_name, str(e)))
        return_value = -1
    return return_value


source_name = "trailer.mp4"
get_source_info_opencv(source_name)

2. 提取素材视频的第 1 帧,第 10 帧,最后一帧,并存储为 JPG 格式的图片

import cv2

# 获取一个视频并打开
cap = cv2.VideoCapture("ROCK.mp4")

if cap.isOpened():  # VideoCaputre对象是否成功打开
    print('已经打开了视频文件')
    fps = cap.get(cv2.CAP_PROP_FPS)  # 返回视频的fps--帧率
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)  # 返回视频的宽
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  # 返回视频的高
    num_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
    print('fps:', fps, 'width:', width, 'height:', height, 'num_frames:', num_frames)
    frame_index = 10  # 根据需要指定要提取的帧索引号,注意计数是从第0帧开始的
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index)
    ret, frame = cap.read()  # 读取一帧视频
    file_name = 'frame' + str(frame_index) + '.jpg'
    cv2.imwrite(file_name, frame)
else:
    print('视频文件打开失败')

3. 提取素材视频中的前 5 帧,并存储为 JPG 格式的图片

import cv2

# 获取一个视频并打开
cap = cv2.VideoCapture("viptrain.avi")

if cap.isOpened():  # VideoCaputre对象是否成功打开
    print('已经打开了视频文件')
    fps = cap.get(cv2.CAP_PROP_FPS)  # 返回视频的fps--帧率
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)  # 返回视频的宽
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  # 返回视频的高
    print('fps:', fps, 'width:', width, 'height:', height)
    i = 0
    while 1:
        if i == 5:
            print('保存了视频的前5帧图像,保存结束')
            break
        else:
            i = i + 1
            ret, frame = cap.read()  # 读取一帧视频
            # ret 读取了数据就返回True,没有读取数据(已到尾部)就返回False
            # frame 返回读取的视频数据--一帧数据
            file_name = '3-3-3frame' + str(i) + '.jpg'
            cv2.imwrite(file_name, frame)
else:
    print('视频文件打开失败')

4. 求视频的帧差

import cv2
import numpy as np

cap = cv2.VideoCapture("viptrain.avi")
# Check if camera opened successfully
if not cap.isOpened():
    print("Error opening video stream or file")
frameNum = 0
# Read until video is completed
while cap.isOpened():
    # Capture frame-by-frame
    ret, frame = cap.read()
    frameNum += 1
    if ret:
        tempframe = frame
        if frameNum == 1:
            previousframe = cv2.cvtColor(tempframe, cv2.COLOR_BGR2GRAY)
        if frameNum >= 2:
            currentframe = cv2.cvtColor(tempframe, cv2.COLOR_BGR2GRAY)
            currentframe = cv2.absdiff(currentframe, previousframe)
            median = cv2.medianBlur(currentframe, 3)

            ret, threshold_frame = cv2.threshold(currentframe, 20, 255, cv2.THRESH_BINARY)
            gauss_image = cv2.GaussianBlur(threshold_frame, (3, 3), 0)
            # Display the resulting frame
            cv2.imshow('原图', frame)
            cv2.imshow('Frame', currentframe)
            cv2.imshow('median', median)
            # Press Q on keyboard to  exit
            if cv2.waitKey(33) & 0xFF == ord('q'):
                break
        previousframe = cv2.cvtColor(tempframe, cv2.COLOR_BGR2GRAY)
    # Break the loop
    else:
        break

# When everything done, release the video capture object
cap.release()

# Closes all the frames
cv2.destroyAllWindows()

5. 计算视频帧速率

# 计算视频帧速率
import cv2

video = cv2.VideoCapture("viptrain.avi");
# Find OpenCV version
(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
if int(major_ver) < 3:
    fps = video.get(cv2.cv.CV_CAP_PROP_FPS)
    print("Frames per second using video.get(cv2.cv.CV_CAP_PROP_FPS): {0}".format(fps))
else:
    fps = video.get(cv2.CAP_PROP_FPS)
    print("Frames per second using video.get(cv2.CAP_PROP_FPS) : {0}".format(fps))

video.release()

6. 计算视频总帧率

# 计算视频总帧数
import os
import cv2

video_cap = cv2.VideoCapture('viptrain.avi')

frame_count = 0
all_frames = []
while True:
    ret, frame = video_cap.read()
    if ret is False:
        break
    all_frames.append(frame)
    frame_count = frame_count + 1

# The value below are both the number of frames
print(frame_count)
print(len(all_frames))

7. 提取视频帧

# 导入所需要的库
import cv2
import numpy as np


# 定义保存图片函数
# image:要保存的图片名字
# addr;图片地址与相片名字的前部分
# num: 相片,名字的后缀。int 类型
def save_image(image, addr, num):
    address = addr + str(num) + '.jpg'
    cv2.imwrite(address, image)


# 读取视频文件
videoCapture = cv2.VideoCapture("talking.mp4")
# 通过摄像头的方式
# videoCapture=cv2.VideoCapture(1)

# 读帧
success, frame = videoCapture.read()
i = 0
timeF = 24  # 间隔timeF帧取1帧
j = 0
while success:
    i = i + 1
    if i % timeF == 0:
        j = j + 1
        save_image(frame, './output/image', j)  # 先在程序目录创建好output文件夹
        print('save image:', j)
    success, frame = videoCapture.read()

  • 实验结果与分析
    1. 读取素材视频,获取视频的参数,如分辨率,帧速率和总帧数

视频名

trailer.mp4

ROCK.mp4

viptrain.avi

结果

​

​

​

2. 提取素材视频的第 1 帧,第 10 帧,最后一帧,并存储为 JPG 格式的图片

第几帧

1

10

最后一帧

结果

​

​

​

3. 提取素材视频中的前 5 帧,并存储为 JPG 格式的图片

视频名

ROCK.mp4

viptrain.avi

talking.mp4

结果

​

​

​

4. 求视频的帧差

视频名

trailer.mp4

ROCK.mp4

viptrain.avi

结果

​

​

​

5. 计算视频帧速率

视频名

trailer.mp4

ROCK.mp4

viptrain.avi

结果

​

​

​

6. 计算视频总帧率

视频名

trailer.mp4

ROCK.mp4

viptrain.avi

结果

​

​

​

7. 提取视频帧

视频名

trailer.mp4

ROCK.mp4

viptrain.avi

结果

​

​

​

六.实验心得体会

在本次实验中****,我对于视频的一些操作有了一定程度的了解,包括视频的帧提取,求帧差以及计算总帧率等.****

​