Created
July 17, 2018 11:43
-
-
Save scottire/7a0de5989ddeda4536faba7ea1f28b3a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -------------------------------------------------------- | |
# Camera sample code for Tegra X2/X1 | |
# | |
# This program could capture and display video from | |
# IP CAM, USB webcam, or the Tegra onboard camera. | |
# Refer to the following blog post for how to set up | |
# and run the code: | |
# https://jkjung-avt.github.io/tx2-camera-with-python/ | |
# | |
# Written by JK Jung <[email protected]> | |
# -------------------------------------------------------- | |
import sys | |
import argparse | |
import cv2 | |
import numpy as np | |
from darkflow.net.build import TFNet | |
windowName = "CameraDemo" | |
def parse_args(): | |
""" | |
Parse input arguments | |
""" | |
parser = argparse.ArgumentParser(description= | |
"Capture and display live camera video on Jetson TX2/TX1") | |
parser.add_argument("--rtsp", dest="use_rtsp", | |
help="use IP CAM (remember to also set --uri)", | |
action="store_true") | |
parser.add_argument("--uri", dest="rtsp_uri", | |
help="RTSP URI string, e.g. rtsp://192.168.1.64:554", | |
default=None, type=str) | |
parser.add_argument("--latency", dest="rtsp_latency", | |
help="latency in ms for RTSP [200]", | |
default=200, type=int) | |
parser.add_argument("--usb", dest="use_usb", | |
help="use USB webcam (remember to also set --vid)", | |
action="store_true") | |
parser.add_argument("--vid", dest="video_dev", | |
help="video device # of USB webcam (/dev/video?) [1]", | |
default=1, type=int) | |
parser.add_argument("--width", dest="image_width", | |
help="image width [1920]", | |
default=1920, type=int) | |
parser.add_argument("--height", dest="image_height", | |
help="image height [1080]", | |
default=1080, type=int) | |
args = parser.parse_args() | |
return args | |
def open_cam_rtsp(uri, width, height, latency): | |
gst_str = ("rtspsrc location={} latency={} ! rtph264depay ! h264parse ! omxh264dec ! " | |
"nvvidconv ! video/x-raw, width=(int){}, height=(int){}, format=(string)BGRx ! " | |
"videoconvert ! appsink").format(uri, latency, width, height) | |
return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER) | |
def open_cam_usb(dev, width, height): | |
# We want to set width and height here, otherwise we could just do: | |
# return cv2.VideoCapture(dev) | |
gst_str = ("v4l2src device=/dev/video{} ! " | |
"video/x-raw, width=(int){}, height=(int){}, format=(string)RGB ! " | |
"videoconvert ! appsink").format(dev, width, height) | |
return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER) | |
def open_cam_onboard(width, height): | |
# On versions of L4T previous to L4T 28.1, flip-method=2 | |
# Use Jetson onboard camera | |
gst_str = ("nvcamerasrc ! " | |
"video/x-raw(memory:NVMM), width=(int)2592, height=(int)1458, format=(string)I420, framerate=(fraction)30/1 ! " | |
"nvvidconv ! video/x-raw, width=(int){}, height=(int){}, format=(string)BGRx ! " | |
"videoconvert ! appsink").format(width, height) | |
return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER) | |
def open_window(windowName, width, height): | |
cv2.namedWindow(windowName, cv2.WINDOW_NORMAL) | |
cv2.resizeWindow(windowName, width, height) | |
cv2.moveWindow(windowName, 0, 0) | |
cv2.setWindowTitle(windowName, "Camera Demo for Jetson TX2/TX1") | |
def read_cam(windowName, cap, tfnet): | |
showHelp = True | |
showFullScreen = False | |
helpText = "'Esc' to Quit, 'H' to Toggle Help, 'F' to Toggle Fullscreen" | |
font = cv2.FONT_HERSHEY_PLAIN | |
while True: | |
if cv2.getWindowProperty(windowName, 0) < 0: # Check to see if the user closed the window | |
# This will fail if the user closed the window; Nasties get printed to the console | |
break; | |
ret_val, img = cap.read() | |
result = tfnet.return_predict(img) | |
print(result) | |
for object in result: | |
label = object["label"] + " Confidence: " + object["confidence"].astype(str) | |
topleft = object["topleft"] | |
bottomright = object["bottomright"] | |
cv2.rectangle(img,(topleft["x"],topleft["y"]),(bottomright["x"],bottomright["y"]),(0,255,0),3) | |
cv2.putText(img, label, (topleft["x"],topleft["y"]-10), font, 2, (32,32,32), 4, cv2.LINE_AA) | |
if showHelp == True: | |
cv2.putText(img, helpText, (11,20), font, 1.0, (32,32,32), 4, cv2.LINE_AA) | |
cv2.putText(img, helpText, (10,20), font, 1.0, (240,240,240), 1, cv2.LINE_AA) | |
cv2.imshow(windowName, img) | |
key = cv2.waitKey(10) | |
if key == 27: # ESC key: quit program | |
break | |
elif key == ord('H') or key == ord('h'): # toggle help message | |
showHelp = not showHelp | |
elif key == ord('F') or key == ord('f'): # toggle fullscreen | |
showFullScreen = not showFullScreen | |
if showFullScreen == True: | |
cv2.setWindowProperty(windowName, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) | |
else: | |
cv2.setWindowProperty(windowName, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_NORMAL) | |
if __name__ == "__main__": | |
args = parse_args() | |
print("Called with args:") | |
print(args) | |
print("OpenCV version: {}".format(cv2.__version__)) | |
if args.use_rtsp: | |
cap = open_cam_rtsp(args.rtsp_uri, args.image_width, args.image_height, args.rtsp_latency) | |
elif args.use_usb: | |
cap = open_cam_usb(args.video_dev, args.image_width, args.image_height) | |
else: # by default, use the Jetson onboard camera | |
cap = open_cam_onboard(args.image_width, args.image_height) | |
if not cap.isOpened(): | |
sys.exit("Failed to open camera!") | |
options = {"model": "darkflow/cfg/tiny-yolo-voc.cfg", "load": "darkflow/cfg/tiny-yolo-voc.weights", "threshold": 0.1} | |
tfnet = TFNet(options) | |
open_window(windowName, args.image_width, args.image_height) | |
read_cam(windowName, cap, tfnet) | |
cap.release() | |
cv2.destroyAllWindows() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment