Untitled

 avatar
unknown
python
a year ago
3.7 kB
7
Indexable
import numpy as np
import cv2
from tqdm import tqdm
from time import time
import warnings
warnings.filterwarnings("ignore")

def viz_text_bg(frame, text, pos, color=(255, 0, 0), font_scale = 1, thickness=1):
    x1, y1, x2, y2 = pos
    txt_size = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, font_scale, thickness)[0]
    frame[y1:y1+txt_size[1], x1:x1+txt_size[0]] = color
    cv2.putText(frame, text, (x1, y1 + txt_size[1]), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255,255,255), thickness=thickness)
    cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2)

    return frame

#================ VIDEO MANAGER ==================
class VideoReader:
    def __init__(self, p):
        self.p = p
        self.cap = cv2.VideoCapture(p)
        self.width  = int(self.cap.get(3))  # float `width`
        self.height = int(self.cap.get(4))  # float `height`
        self.fps = int(self.cap.get(5))
        self.n = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT))

    def destroy(self):
        self.cap.release()
        
    def __getitem__(self, index):
        count = 0
        while True:
            ret, frame = self.cap.read()
            if ret == True and count < index:
                count += 1
            else:
                break

        self.destroy()
        self.cap = cv2.VideoCapture(self.p)
        return frame

    def __len__(self):
        return self.n

    def play(self):
        while(True):
            
            _, frame = self.cap.read()
            
            if frame is None:
                break

            # Display the resulting frame
            cv2.imshow('frame', frame)
            

        self.cap.release()
        cv2.destroyAllWindows()


class VideoWriter:
    def __init__(self, p, fps, w, h):
        self.out = cv2.VideoWriter(p, cv2.VideoWriter_fourcc(*'mp4v'), int(fps), (w, h))

    def destroy(self):
        self.out.release()

    def write(self, frame):
        self.out.write(frame)

class VideoManager:
    def __init__(self, p):
        self.read = VideoReader(p)
        self.exports = {}
        self.n_vid = len(self.read)

    def __len__(self):
        return self.n_vid
    
    def iter(self, skip=1):
        self.n_vid = len(self)//skip
        self.pbar = tqdm(range(len(self)), bar_format='{percentage:3.0f}%|{bar:10}|[{elapsed}<{remaining}{postfix}]')
        for i in self.pbar:
            start = time()

            self.postfix_str = "" 

            for _ in range(skip):
                _, frame = self.read.cap.read()

            if frame is None:
                break

            yield i, frame

            end = time()
            self.postfix_str += f"frame<{i+1}:{len(self.pbar)}"
            self.postfix_str += f", fps={skip/(end-start):.2f}"
            self.pbar.set_postfix_str(self.postfix_str)
        
        self.read.destroy()
        for k in self.exports:
            self.exports[k].destroy()
        # cv2.destroyAllWindows()
    
    def write(self, frame, p_out):
        name = p_out.split('/')[-1].split(".")[0]
        if name not in self.exports:
            self.exports[name] = VideoWriter(p_out, self.read.fps, frame.shape[1], frame.shape[0])
        
        if len(frame.shape) < 3:
                frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
        
        self.exports[name].write(frame)

    def show(self, frame, name="frame"):
        cv2.imshow(name, frame)

otp = OpticalFlow(320)
vid = VideoManager(f"../inp/{name}")
for i, frame in vid.iter(skip=2):
    flow = otp.get(frame)
    
    vid.write(frame, f"../inp/det/infer_{name}")
Editor is loading...
Leave a Comment