要使用jeston nano进行事实图像处理,摄像头是比不可少的。在嵌入式领域,摄像头的种类非常多接口和驱动方法也各有不同。然而jeston nano板载且推荐使用的是CSI总线的摄像头,这个总线在单片机上还是比较少见的。这里的CSI排线是15PIN的软排线,可以弯但是不能折,如果产生折痕会造成生成的信号模糊有雪花。我之前的排线就是图省事在搬运测试的时候不小心折了一下,结果整个图像都糊了。弯折和弯折后排出的图像入下图所示。
Jeston nano自带了摄像头的驱动程序,所以这里只需要一条指令就可以开启摄像头
nvgstcapture-1.0
想关掉摄像头的额话,直接在终端输入 q 再按回车 。
想捕获图片的话,在终端输入 j 再按回车,图片将保存当前目录下。我使用的是下图所示的摄像头,这个摄像头是红外夜视摄像头,适合在黄昏和光线比较昏暗的情况下使用。
正常情况下拍出来的照片则会发红。因此我们需要换驱动。下载camera-override.isp文件,解压到特定文件夹。
wget http://www.waveshare.net/w/upload/e/eb/Camera_overrides.tar.gz
tar zxvf Camera_overrides.tar.gz
sudo cp camera_overrides.isp /var/nvidia/nvcam/settings/
安装文件:
sudo chmod 664 /var/nvidia/nvcam/settings/camera_overrides.isp sudo chown root:root /var/nvidia/nvcam/settings/camera_overrides.isp
正常拍摄出的图像入下图所示,可见正常情况下,拍出的照片质量是非常好的。
光使用shell指令处理控制摄像头是远远不够的,在进行深度学习的时候。我们使用python代码进行AI搭建,因此这里也使用python的方式进行摄像头数据的拉取。代码如下:
#导入openCV
import cv2
#定义捕获参数
def gstreamer_pipeline(
capture_width=1280,
capture_height=720,
display_width=1280,
display_height=720,
framerate=60,
flip_method=0,
):
return (
"nvarguscamerasrc ! "
"video/x-raw(memory:NVMM), "
"width=(int)%d, height=(int)%d, "
"format=(string)NV12, framerate=(fraction)%d/1 ! "
"nvvidconv flip-method=%d ! "
"video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx ! "
"videoconvert ! "
"video/x-raw, format=(string)BGR ! appsink"
% (
capture_width,
capture_height,
framerate,
flip_method,
display_width,
display_height,
)
)
def show_camera():
cap = cv2.VideoCapture(gstreamer_pipeline(flip_method=0), cv2.CAP_GSTREAMER)
while cap.isOpened():
flag, img = cap.read()
cv2.imshow("CSI Camera", img)
ww = cv2.waitKey(1)
# do other things
if ww == ord('q'): # 按下 q 键,退出
break
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
show_camera()
我们和前几篇博客一样,我们简单分析一下这个代码,首先导入openCV这个库,这个再前几篇博客我们已经检查过了。第一个函数初始化摄像头采集的参数并且向控制台打印。第二个函数中先调用了cv2.VideoCapture这个函数并且传了两个参数,分别为我们之前初始的参数和cv2.CAP_GSTREAMER。Gstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。
这种调用方式有别与笔记本电脑的调用,我们也可以给笔记本电脑按照openCV,如下图所示,这里我是用的是pycharm和Anaconda的环境。
然后运行上门这段代码把cap = cv2.VideoCapture(gstreamer_pipeline(flip_method=0), cv2.CAP_GSTREAMER)改成cap = cv2.VideoCapture(0),就可以使用笔记本的摄像头。如下图所示。
代码后面也只是调用几个函数来管理和销毁窗口,没什么好说的。通过本次测试,完成了python对摄像头的控制,这方便我们在日后的实验中,使用神经网络拉取实时图像