利用cv2库获取视频流关键帧

利用cv2库获取视频流关键帧

import os
import threading
import time
import cv2

# yolo v3对416*416图像识别是最佳状态
# http://192.168.3.14:8080/video
extractImage = None


def ExtractVideoStream(videoPath='',
                       imageOutPath='',
                       imageSave=True,
                       imageSize=(416, 416),
                       jpgQuality=100,
                       extractInterval=1000,
                       ):
    '''
    :param videoPath: 源视频流地址
    :param imageOutPath:提取到的图像帧保存路径
    :param imageSave:是否要保存图像帧
    :param imageSize:获取到图像帧的大小
    :param jpgQuality:获取到的jpg图像质量
    :param extractInterval:获取图像帧的时间间隔
    :return:null
    '''

    # 获取视频流
    cap = cv2.VideoCapture(videoPath)
    # 判断视频流获取状态
    success = cap.read()
    if (success):
        print("成功获取视频流")
    else:
        raise NameError("未获取到视频流")

    while (success):
        global extractImage
        start = time.time()
        success, extractImage = cap.read()
        end = time.time()
        # 读取操作耗时
        seconds = end - start
        # 服务器端捕获视频流的fps
        #Fps = 1 / seconds
        # 视频源图像大小
        #video_size = (cap.get(cv2.CAP_PROP_FRAME_WIDTH), cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
        extractImage = cv2.resize(extractImage, imageSize)

        # 睡眠
        time.sleep(extractInterval / 1000)

        print(time.localtime())

        if (imageSave):
            cv2.imwrite(os.path.join(imageOutPath, "video" + "_{:d}_{:d}_{:d}.jpg".format(time.localtime().tm_hour,
                                                                                          time.localtime().tm_min,
                                                                                          time.localtime().tm_sec)),
                        extractImage,
                        [int(cv2.IMWRITE_JPEG_QUALITY), jpgQuality])


thread_extract = threading.Thread(target=ExtractVideoStream,
                                  args=['./Linkin.mp4', 'F:/image', True, (720, 720), 80, 1000])
thread_extract.start()

# 由于刚开始获取视频流时需要一定的初始化时间,这里利用异步访问,将等待三秒
time.sleep(3)

# 目前获取到的extractImage就是待操作图像
cv2.imwrite("输入你的图片位置", extractImage, [int(cv2.IMWRITE_JPEG_QUALITY), 80])

你可能感兴趣的:(数据结构(算法))