视频数据使用 iter next读取帧图片,送入模型输出数据yield返回输出结果

import cv2
from flask import *
import paddlex as pdx
import flask
import uuid
import os
import time
import json
import sys
import threading
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed

class VideoIter(object):
    def __init__(self, video_name):
        self.cap = cv2.VideoCapture(video_name)
        self.size = [int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)),
                     int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))]
        self.fps = self.cap.get(cv2.CAP_PROP_FPS)  #视频的帧率
        assert self.cap.isOpened(), FileNotFoundError
        self.num_frame = self.cap.get(cv2.CAP_PROP_FRAME_COUNT)  #视频的帧数
        self.frame = 1

    def __iter__(self):
        return self

    def __next__(self):  #本身就有for功能  一次next 相当于循环一次
        # while True:
        # if self.frame % 100==0:  #1逐帧提取特征  10帧取得
        ret, img = self.cap.read()
        if not ret :  #视频读取到最后释放视频
            self.cap.release()
            raise StopIteration

        print("=============> 视频帧数字", self.frame,ret)
        self.frame += 1  #视频的帧数计数
        return img


class Detector(object):  #初始化 检测器模型,
    def __init__(self):
        global model, predictor
        # model = pdx.load_model('./best_model')  #提前加载模型,逐帧加载速度太慢占用内存
        predictor = pdx.deploy.Predictor('./inference_model', use_gpu=True)  # 高性能预测接口

        # pass

    def detect_video(self, path,iou_thres=0.4):
        list = []
        video_dataset = VideoIter(path)  # 视频数据读取iter方式

        for img in video_dataset:  # 一个视频的所有图片循环(内部是iter next 处理
            n = video_dataset.frame
            print("=============> 视频第几帧 ",n)
            # yield n # 每张图返回处理结果,用yield
            # result_list = predictor.predict(img)

        print("end")
        print(list)
        yield 3 # 也可以全部结束,返回结果,jsonify(list)  # next对应  用yield返回而不是return
        return 0  #一个视频所有的数据
det = Detector()  #初始化模型,构建检测器实例
path="http://*.mp4"

infer = det.detect_video(path) #调用函数detect_video, 内部视频数据读取,是 iter next 类 加载视频数据,
while True:
    try:
        result = next(infer)  #这里循环一次next访问一张图片输入模型计算得到结果, 这里是 用到yield返回数据在循环中返回,不是return
        print(result)
    except StopIteration: #next  迭代结束报这个问题
        print("视频结束")
        break
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值