jetson nano 学习日志(五)

要使用jeston nano进行事实图像处理,摄像头是比不可少的。在嵌入式领域,摄像头的种类非常多接口和驱动方法也各有不同。然而jeston nano板载且推荐使用的是CSI总线的摄像头,这个总线在单片机上还是比较少见的。这里的CSI排线是15PIN的软排线,可以弯但是不能折,如果产生折痕会造成生成的信号模糊有雪花。我之前的排线就是图省事在搬运测试的时候不小心折了一下,结果整个图像都糊了。弯折和弯折后排出的图像入下图所示。

jetson nano 学习日志(五)_第1张图片

jetson nano 学习日志(五)_第2张图片

Jeston nano自带了摄像头的驱动程序,所以这里只需要一条指令就可以开启摄像头

nvgstcapture-1.0

想关掉摄像头的额话,直接在终端输入 q 再按回车 。

想捕获图片的话,在终端输入 j 再按回车,图片将保存当前目录下。我使用的是下图所示的摄像头,这个摄像头是红外夜视摄像头,适合在黄昏和光线比较昏暗的情况下使用。

jetson nano 学习日志(五)_第3张图片

正常情况下拍出来的照片则会发红。因此我们需要换驱动。下载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

正常拍摄出的图像入下图所示,可见正常情况下,拍出的照片质量是非常好的。

jetson nano 学习日志(五)_第4张图片

光使用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_GSTREAMERGstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。

这种调用方式有别与笔记本电脑的调用,我们也可以给笔记本电脑按照openCV,如下图所示,这里我是用的是pycharm和Anaconda的环境。

jetson nano 学习日志(五)_第5张图片然后运行上门这段代码把cap = cv2.VideoCapture(gstreamer_pipeline(flip_method=0), cv2.CAP_GSTREAMER)改成cap = cv2.VideoCapture(0),就可以使用笔记本的摄像头。如下图所示。 

jetson nano 学习日志(五)_第6张图片

代码后面也只是调用几个函数来管理和销毁窗口,没什么好说的。通过本次测试,完成了python对摄像头的控制,这方便我们在日后的实验中,使用神经网络拉取实时图像

你可能感兴趣的:(jeston,nano,嵌入式硬件,linux,python)