-
-
Save jetsonhacks/bec32dccf61528fa658821ef145aa08c to your computer and use it in GitHub Desktop.
#!/usr/bin/env python | |
# MIT License | |
# Copyright (c) 2017 Jetsonhacks | |
# Permission is hereby granted, free of charge, to any person obtaining a copy | |
# of this software and associated documentation files (the "Software"), to deal | |
# in the Software without restriction, including without limitation the rights | |
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
# copies of the Software, and to permit persons to whom the Software is | |
# furnished to do so, subject to the following conditions: | |
# The above copyright notice and this permission notice shall be included in all | |
# copies or substantial portions of the Software. | |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
# SOFTWARE. | |
import sys | |
import cv2 | |
import numpy as np | |
def read_cam(): | |
# On versions of L4T previous to L4T 28.1, flip-method=2 | |
# Use the Jetson onboard camera | |
cap = cv2.VideoCapture("nvcamerasrc ! video/x-raw(memory:NVMM), width=(int)1280, height=(int)720,format=(string)I420, framerate=(fraction)30/1 ! nvvidconv flip-method=0 ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink") | |
if cap.isOpened(): | |
windowName = "CannyDemo" | |
cv2.namedWindow(windowName, cv2.WINDOW_NORMAL) | |
cv2.resizeWindow(windowName,1280,720) | |
cv2.moveWindow(windowName,0,0) | |
cv2.setWindowTitle(windowName,"Canny Edge Detection") | |
showWindow=3 # Show all stages | |
showHelp = True | |
font = cv2.FONT_HERSHEY_PLAIN | |
helpText="'Esc' to Quit, '1' for Camera Feed, '2' for Canny Detection, '3' for All Stages. '4' to hide help" | |
edgeThreshold=40 | |
showFullScreen = False | |
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, frame = cap.read(); | |
hsv=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) | |
blur=cv2.GaussianBlur(hsv,(7,7),1.5) | |
edges=cv2.Canny(blur,0,edgeThreshold) | |
if showWindow == 3: # Need to show the 4 stages | |
# Composite the 2x2 window | |
# Feed from the camera is RGB, the others gray | |
# To composite, convert gray images to color. | |
# All images must be of the same type to display in a window | |
frameRs=cv2.resize(frame, (640,360)) | |
hsvRs=cv2.resize(hsv,(640,360)) | |
vidBuf = np.concatenate((frameRs, cv2.cvtColor(hsvRs,cv2.COLOR_GRAY2BGR)), axis=1) | |
blurRs=cv2.resize(blur,(640,360)) | |
edgesRs=cv2.resize(edges,(640,360)) | |
vidBuf1 = np.concatenate( (cv2.cvtColor(blurRs,cv2.COLOR_GRAY2BGR),cv2.cvtColor(edgesRs,cv2.COLOR_GRAY2BGR)), axis=1) | |
vidBuf = np.concatenate( (vidBuf, vidBuf1), axis=0) | |
if showWindow==1: # Show Camera Frame | |
displayBuf = frame | |
elif showWindow == 2: # Show Canny Edge Detection | |
displayBuf = edges | |
elif showWindow == 3: # Show All Stages | |
displayBuf = vidBuf | |
if showHelp == True: | |
cv2.putText(displayBuf, helpText, (11,20), font, 1.0, (32,32,32), 4, cv2.LINE_AA) | |
cv2.putText(displayBuf, helpText, (10,20), font, 1.0, (240,240,240), 1, cv2.LINE_AA) | |
cv2.imshow(windowName,displayBuf) | |
key=cv2.waitKey(10) | |
if key == 27: # Check for ESC key | |
cv2.destroyAllWindows() | |
break ; | |
elif key==49: # 1 key, show frame | |
cv2.setWindowTitle(windowName,"Camera Feed") | |
showWindow=1 | |
elif key==50: # 2 key, show Canny | |
cv2.setWindowTitle(windowName,"Canny Edge Detection") | |
showWindow=2 | |
elif key==51: # 3 key, show Stages | |
cv2.setWindowTitle(windowName,"Camera, Gray scale, Gaussian Blur, Canny Edge Detection") | |
showWindow=3 | |
elif key==52: # 4 key, toggle help | |
showHelp = not showHelp | |
elif key==44: # , lower canny edge threshold | |
edgeThreshold=max(0,edgeThreshold-1) | |
print 'Canny Edge Threshold Maximum: ',edgeThreshold | |
elif key==46: # , raise canny edge threshold | |
edgeThreshold=edgeThreshold+1 | |
print 'Canny Edge Threshold Maximum: ', edgeThreshold | |
elif key==74: # Toggle fullscreen; This is the F3 key on this particular keyboard | |
# Toggle full screen mode | |
if showFullScreen == False : | |
cv2.setWindowProperty(windowName, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) | |
else: | |
cv2.setWindowProperty(windowName, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_NORMAL) | |
showFullScreen = not showFullScreen | |
else: | |
print "camera open failed" | |
if __name__ == '__main__': | |
read_cam() |
My guess is that you have to use nvarguscamerasrc, something like:
cv2.VideoCapture("nvarguscamerasrc ! video/x-raw(memory:NVMM), width=(int)1280, height=(int)720, format=(string)NV12, framerate=(fraction)30/1 ! nvvidconv ! video/x-raw,format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink")
Thanks but this didn't work either. This works on the command line:
gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), width=640, height=480, framerate=30/1, format=NV12' ! nvvidconv flip-method=4 ! nvegltransform ! nveglglessink -e
However when I put the same string in the python code it doesn't work. I changed the nveglglessink
to appsink
. Like this:
cap = cv2.VideoCapture("nvarguscamerasrc ! 'video/x-raw(memory:NVMM), width=640, height=480, framerate=30/1, format=NV12' ! nvvidconv flip-method=4 ! nvegltransform ! appsink")
I have a jetson tx2 and I am getting camera open failed using the original string and also the string in jetsonhacks' post. Any ideas?