Source code for rcpcv.demo
# useful machine vision routines shared by multiple samples
import argparse
import numpy as np
import cv2 as cv
#================================================================
def open_video_output(frame, args):
# Open a video output file sized for the given sample frame. The frame is not written.
codec_code = cv.VideoWriter.fourcc(*'MJPG') # motion JPEG
frame_width = frame.shape[1] # cols
frame_height = frame.shape[0] # rows
frame_rate = args.fps
return cv.VideoWriter(args.out, codec_code, frame_rate, (frame_width, frame_height))
#================================================================
[docs]
def parse_args(parser):
"""Add additional common arguments and process the command line. Returns an argparse results object."""
parser.add_argument('-q','--quiet', action='store_true', help="run without viewer window or console output")
parser.add_argument('--fps', default=30, type=int, help="output file frame rate (default: %(default)s)")
parser.add_argument('--verbose', action='store_true', help="enable even more detailed console output" )
parser.add_argument('--live', action='store_true', help="use camera for input (ignores -i) (default: %(default)s).")
parser.add_argument('--camera', default=0, type=int, help="camera number (default: %(default)s).")
parser.add_argument('-i', '--input', default="frames.avi", type=str, help="input AVI file name (default: %(default)s)")
parser.add_argument('out', default="processed.avi", type=str, nargs='?', help="output AVI file name (default: %(default)s)")
return parser.parse_args()
#================================================================
def prepare_inputs(args):
if args.live:
capture = cv.VideoCapture(args.camera)
else:
capture = cv.VideoCapture(args.input)
if not capture.isOpened():
print("Unable to open video input source, exiting.")
exit(1)
if not args.quiet:
cv.namedWindow("capture")
return capture
#================================================================
[docs]
def run_filter(args, callback):
"""Process a video input stream through a filter callback function."""
capture = prepare_inputs(args)
# the output file will be created after the frame size is known
output = None
try:
while True:
success, frame = capture.read()
if not success or frame is None:
if args.live:
continue # when using a camera, ignore empty frames
else:
break # when reading from a file, empty frame is the end
if args.verbose:
print("read image of shape %s" % (str(frame.shape)))
# apply script-specific processing
frame = callback(frame, args)
if not args.quiet:
cv.imshow("capture", frame) # display the frame
if output is None:
output = open_video_output(frame, args)
if output is not None:
output.write(frame)
if args.verbose:
print("wrote frame to file.")
# If using the GUI, calling waitKey allows the window system event loop to run and update
# the display. The waitKey argument is in milliseconds.
if not args.quiet:
key = cv.waitKey(33) & 0xFF
if key == ord('q'):
break
except KeyboardInterrupt:
print ("User quit.")
output.release()
capture.release()
#================================================================