initial commit
This commit is contained in:
		
						commit
						54f5b12c52
					
				| 
						 | 
				
			
			@ -0,0 +1,110 @@
 | 
			
		|||
import argparse
 | 
			
		||||
import cv2 as cv
 | 
			
		||||
from itertools import count
 | 
			
		||||
import numpy as np
 | 
			
		||||
 | 
			
		||||
def duration(cap):
 | 
			
		||||
    """
 | 
			
		||||
    return the duration of the capture in seconds
 | 
			
		||||
    """
 | 
			
		||||
    nframes = int(cap.get(cv.CAP_PROP_FRAME_COUNT))
 | 
			
		||||
    fps = cap.get(cv.CAP_PROP_FPS)
 | 
			
		||||
 | 
			
		||||
    return nframes / fps
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def capture_shape(cap):
 | 
			
		||||
    """
 | 
			
		||||
    return the shape of the video capture
 | 
			
		||||
    """
 | 
			
		||||
    nframes = int(cap.get(cv.CAP_PROP_FRAME_COUNT))
 | 
			
		||||
    height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
 | 
			
		||||
    width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
 | 
			
		||||
 | 
			
		||||
    return (nframes, height, width)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def transposed_shape(shape, axis):
 | 
			
		||||
    """
 | 
			
		||||
    return the shape of the video capture after transposing the given axis to
 | 
			
		||||
    become the new time axis
 | 
			
		||||
    """
 | 
			
		||||
    nframes, height, width = shape
 | 
			
		||||
    if axis == 1:
 | 
			
		||||
        new_shape = (height, nframes, width)
 | 
			
		||||
    elif axis == 2:
 | 
			
		||||
        new_shape = (width, height, nframes)
 | 
			
		||||
 | 
			
		||||
    return new_shape
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def transpose_frame(infile, n, axis):
 | 
			
		||||
    """
 | 
			
		||||
    compute the nth frame of the input file after transposing the given axis to
 | 
			
		||||
    become the new time axis
 | 
			
		||||
    """
 | 
			
		||||
    cap = cv.VideoCapture(infile)
 | 
			
		||||
 | 
			
		||||
    shape = capture_shape(cap)
 | 
			
		||||
    _, height, width = transposed_shape(shape, axis)
 | 
			
		||||
    tframe = np.empty((height, width, 3), np.dtype('uint8'))
 | 
			
		||||
 | 
			
		||||
    for i in count(0):
 | 
			
		||||
        # NOTE: reading each frame of the input to produce one output frame is
 | 
			
		||||
        # CPU-intensive, but to read the frames fewer times, we would have to
 | 
			
		||||
        # store the frames in memory, which is memory-intensive
 | 
			
		||||
        ret, frame = cap.read()
 | 
			
		||||
        if not ret:
 | 
			
		||||
            break
 | 
			
		||||
 | 
			
		||||
        if axis == 1:
 | 
			
		||||
            tframe[i] = frame[n]
 | 
			
		||||
        elif axis == 2:
 | 
			
		||||
            tframe[:, i] = frame[:, n]
 | 
			
		||||
 | 
			
		||||
    cap.release()
 | 
			
		||||
    return tframe
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def transpose_capture(infile, outfile, axis):
 | 
			
		||||
    """
 | 
			
		||||
    transpose the input file along the given axis, storing the output in
 | 
			
		||||
    outfile
 | 
			
		||||
    """
 | 
			
		||||
    cap = cv.VideoCapture(infile)
 | 
			
		||||
 | 
			
		||||
    seconds = duration(cap)
 | 
			
		||||
    shape = capture_shape(cap)
 | 
			
		||||
    nframes, height, width = transposed_shape(shape, axis)
 | 
			
		||||
    fps = nframes / seconds
 | 
			
		||||
 | 
			
		||||
    cap.release()
 | 
			
		||||
 | 
			
		||||
    fourcc = cv.VideoWriter.fourcc(*'h264')
 | 
			
		||||
    out = cv.VideoWriter(outfile, fourcc, fps, (width, height))
 | 
			
		||||
 | 
			
		||||
    for i in range(0, nframes):
 | 
			
		||||
        tframe = transpose_frame(infile, i, axis)
 | 
			
		||||
        out.write(tframe)
 | 
			
		||||
 | 
			
		||||
    out.release()
 | 
			
		||||
    cv.destroyAllWindows()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    parser = argparse.ArgumentParser()
 | 
			
		||||
    parser.add_argument("source")
 | 
			
		||||
    parser.add_argument("dest")
 | 
			
		||||
 | 
			
		||||
    group = parser.add_mutually_exclusive_group(required=True)
 | 
			
		||||
    group.add_argument("--height", action='store_true')
 | 
			
		||||
    group.add_argument("--width", action='store_true')
 | 
			
		||||
 | 
			
		||||
    args = parser.parse_args()
 | 
			
		||||
 | 
			
		||||
    if args.height:
 | 
			
		||||
        axis = 1
 | 
			
		||||
    elif args.width:
 | 
			
		||||
        axis = 2
 | 
			
		||||
 | 
			
		||||
    transpose_capture(args.source, args.dest, axis)
 | 
			
		||||
		Loading…
	
		Reference in New Issue