-
-
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?