jetson NanoCamera(USB摄像头连接)上篇文章简单的分析了,使用USB摄像头捕获视频流的内部过程。今天这篇文章算是最后的一篇使用文,会从现在拥有的功能,安装,使用等方面描述一下.
以上内容为支持的功能,而且一部分功能需要opencv的帮助: pip3 install opencv-python 安装一下 pip3 install nanocamera pip安装 git clone https://github.com/thehapyone/NanoCamera cd NanoCamera sudo python3 setup.py install 源码安装。 接下来讲解使用过程: CSI摄像头的使用 import nanocamera as nano # Create the Camera instance for 640 by 480 camera = nano.Camera() 需要设置为camera_type = 0.默认是FPS 30,大小为640x480,而且不旋转 自定义高度,宽度 import nanocamera as nano # Create the Camera instance for No rotation (flip=0) with size of 1280 by 800 camera = nano.Camera(flip=0, width=1280, height=800, fps=30) 多个CSI摄像头的使用: import nanocamera as nano # Create the Camera instance for No rotation (flip=0) with size of 1280 by 800 # Connect to CSI camera with ID 0 (Default) camera_1 = nano.Camera(device_id=0, flip=0, width=1280, height=800, fps=30) # Connect to another CSI camera on the board with ID 1 camera_2 = nano.Camera(device_id=1, flip=0, width=1280, height=800, fps=30) 用camera_id来指定。 使用USB摄像头: import nanocamera as nano # Create the Camera instance for No rotation (flip=0) with size of 640 by 480 camera = nano.Camera(camera_type=1, device_id=1, width=640, height=480, fps=30) 相机种类为1,设备的id也得填入。 ls /dev/video* 在linux系统下执行这个命令看自己的摄像头名字。 RTSP的摄像头使用下面的代码来设置: # a location for the rtsp stream. Stream location without "rtsp://" rtsp_location = "192.168.1.26:8554/stream" # Create the Camera instance camera = nano.Camera(camera_type=2, source=rtsp_location, width=640, height=480, fps=30)
种类为2,而且要设置source rtsp_location = "192.168.1.26:8554/stream" 还有一种摄像头是IP、MJPMG的摄像头或者照片: # a location for the camera stream. Stream location without "http://" camera_stream = "192.168.1.26:80/stream" # Create the Camera instance camera = nano.Camera(camera_type=3, source=camera_stream, width=640, height=480, fps=30)
记得把相机的种类设置为3,流媒体的source也要打开 camera_stream = "192.168.1.26:80/stream" 特别要需要知道自己的相机的位置所在。 这个代码可以让你的相机强制一个速率来获得帧 import nanocamera as nano # enforce the capture frame rate with the enforce_fps=True camera = nano.Camera(camera_type=1, device_id=1, width=640, height=480, fps=30, enforce_fps=True) 读取视频流的代码: frame = camera.read() 获得的格式是numpy.ndarray(),格式为BGR,这个转换写过很多了,自己感兴趣的可以看看 在这么多传输的流程里面,一定要一直确保相机的正常使用,所以有保证相机运行正常的代码 status = camera.isReady() 接下来会给出SCI相机的连接代码: import cv2 #from nanocamera.NanoCam import Camera import nanocamera as nano
if __name__ == '__main__': # Create the Camera instance camera = nano.Camera(flip=0, width=640, height=480, fps=30) print('CSI Camera ready? - ', camera.isReady()) while camera.isReady(): try: # read the camera image frame = camera.read() # display the frame cv2.imshow("Video Frame", frame) if cv2.waitKey(25) & 0xFF == ord('q'): break except KeyboardInterrupt: break
# close the camera instance camera.release()
# remove camera object del camera
IP/MPJEG的代码: import cv2 # from nanocamera.NanoCam import Camera import nanocamera as nano if __name__ == '__main__': # requires the Camera streaming url. Something like this: http://localhost:80/stream # For IP/MJPEG camera, the camera_type=3. # This works with only camera steaming MJPEG format and not H.264 codec for now # a location for the camera stream camera_stream = "192.168.1.26:80" # Create the Camera instance camera = nano.Camera(camera_type=3, source=camera_stream, width=640, height=480, fps=30) print('MJPEG/IP Camera is now ready') while camera.isReady(): try: # read the camera image frame = camera.read() # display the frame cv2.imshow("Video Frame", frame) if cv2.waitKey(25) & 0xFF == ord('q'): break except KeyboardInterrupt: break # close the camera instance camera.release() # remove camera object del camera
其实这些代码都没哟什么好说的,都是建立一个对象,按规则初始化,然后就是CV2接管来进行渲染输出等。 这个库最好的地方在于它的可调试性,不是说它的调试功能多强大,而是夸它的实现。 如果你在代码中使用了: camere.hasError() 这个代码,会在所有的有错误的地方打印错误的代码的列表和布尔值 # status holds a list. status = camera.hasError() print (status) >> ([0, 3], True) print ("错误代码列表 : ", status[0]) >> Error codes list : [0, 3] print ("Error State : ", status[1]) >> Error State: True
错误的代码是: ''' -1 = Unknown error 0 = No error 1 = Error: Could not initialize camera. 2 = Thread Error: Could not read image from camera 3 = Error: Could not read image from camera 4 = Error: Could not release camera '''
在写一个例子: error_status = camera.hasError() if error_status[1] == False: # means no error detected so far # read the camera image frame = camera.read() # print the current error codes print (error_status[0]) # display the frame cv2.imshow("Video Frame", frame) if cv2.waitKey(25) & 0xFF == ord('q'): break else: # an error has occured. print ("An error with the camera. Error code : ", error_status[0])
debug开关先使能,一般来说其实是调试多线程的应用。 接下来的例子是一个开发时的样板例子: if __name__ == '__main__': # with debug=True. An Exception will be raised if something goes wrong. # Create the Camera instance try: # Create the Camera instance print("camera stream") camera = nano.Camera(camera_type=1, device_id=0, fps=30, debug=True) except Exception as e: # handle the exception from opening camera session else: print('USB Camera ready? - ', camera.isReady()) while True: try: # read the camera image frame = camera.read() # do something with frame like: send_to_cloud(frame) except KeyboardInterrupt: break except Exception as e: # handle the exception from reading break print("done here") try: # close the camera instance camera.release() except Exception as e: # handle the exception from releasing the camera 自定义了错误的等级: The except cause might catch the following exceptions: >> Exception Type - Error: Could not initialize USB Camera >> Exception Type - An error as occurred. Error Value: [0, 3] >> Exception Type - Unknown Error has occurred >> Exception Type - Error: Could not release camera 这个就是抛出的东西,可以看到到底是哪里出了毛病。 大概就是这么多了,接下来的话,就是去机器上面运行了~ |
|