精华内容
下载资源
问答
  • Nano

    2016-01-30 22:05:00
    Nano命令指南 今天在输命令时,无意中输入了nano,对这个命令不太熟悉,结果不知道如何才能退出,保存,赶快查了一下资料,原来是这样的啊。 打开文件与新建文件 使用nano打开或新建文件,只需键入: ...

    Nano命令指南

          今天在输命令时,无意中输入了nano,对这个命令不太熟悉,结果不知道如何才能退出,保存,赶快查了一下资料,原来是这样的啊。

        打开文件与新建文件

         使用nano打开或新建文件,只需键入:

    代码 1.1: 打开或新建文件

    #nano 文件名

    Nano是一种单模式编辑器,你可以直接输入文字。如果你要编辑一个像/etc/fstab一样的配置文件,请使用-w参数,例如:

    代码 1.2: 禁用自动换行

    #nano -w /etc/fstab

    警告:这非常重要。如果在编辑配置文件时忘了加-w参数,可能会导致你的系统无法起动或产生别的异常。

    保存和退出

    如果你要保存所做的修改,按下Ctrl+O。想要退出,按下Ctrl+X。如果你退出前没有保存所做的修改,它会提示你是否要保存。如果不要,请按N,反之,则按Y。然后它会让你确认要保存的文件名,确认或修改后按Enter即可。

    如果你没有修改好而不小心按了保存键,您可以在请求确认文件名时按Ctrl+C来取消。

    剪切和粘贴

    要剪切一整行,请用Ctrl+K(按住Ctrl不放,再按下K键)。光标所在的行便消失了。要粘贴它,只需把光标移动到您所要粘贴的位置,然后按Ctrl+U即可。要移动多行,只需多按几次Ctrl+K把需要移动内容都剪切下来,然后按一次Ctrl+U就可以把刚剪切的内容全部粘贴上来。

    如果你想使用更精确的剪切控制,则需要给文本做标记。移动光标到需要剪切文本的开头,按下Ctrl+6(或者Alt+A)。然后移动光标到待剪切文本的末尾:被做了标记的文本便会反白。要撤消文本标记,只需再按一次Ctrl+6。用Ctrl+K来剪切被标记的文本,用Ctrl+U来粘贴。

    搜索特定文字

    当你想搜索某特定文字时,只要想成"WhereIs"而不是"Search",事情就简单了。只要按下Ctrl+W,键入你要搜索的字符串,再按Enter就可以了。想再次搜索相同的字符串,可以直接按Alt+W。

    注意:在nano帮助文档里,Ctrl-键被表示为一个脱字符(^),因此Ctrl+W被写成了^W,等等。Alt-键被表示为一个M(从"Meta"而来),因此Alt+W被写成了M-W。

    转载于:https://www.cnblogs.com/1995hxt/p/5172221.html

    展开全文
  • nano

    2014-03-23 18:41:40
    1介绍 GNU的Nano是一个简单的基本终端文本编辑。尽管没有Emacs或者Vim强大,但是Nano学习和使用简单。

    1介绍

    GNU的Nano是一个简单的基本终端文本编辑。尽管没有Emacs或者Vim强大,但是Nano学习和使用简单。Nano用于现存配置文件小的改动或者是写比较短的普通文本文件的理想选择。它最初是为非自由Pico编辑器免费替代者。Pico是基于终端的编辑器,用于华盛顿大学的Pine邮件。

    Nano可以用在终端窗口或者是终端控制台。

    Nano的基本使用如下,如果你想学习先进的技术,比如多缓冲区或者是代码强调语法,那么就看GNU Nano编辑器FAQ.

    2安装Nano

    Nano是标准安装Ubuntu的一部分,应该已经在你的系统中了。如果因为某些原因,它不存在,使用你最喜爱的软件包管理器安装。下面的例子展示了怎样使用恰当的命令行安装Nano包获取程序。您在您的终端应该输入:

    sudo apt-get install nano

    当出现提示时,输入你的密码,这个密码是你登陆Ubuntu时使用的。

    3.使用Nano

    Nano是一个基于终端的命令行程序。虽然它不复杂或难以使用,它和基于GUI的文本编辑器,比如gedit是不一样的。两个主要的功能是,不同的快捷键组合和鼠标的使用。

    注意,本讨论是明确针对在终端使用Nano的。在系统控制台使用Nano是完全相同的,主要区别是鼠标的使用。

    3.1启动Nano

    在一个空文件中启动Nano,打开终端,输入命令行”nano“注意没有引号。比如:

    jeffsch@mandela:~ nano

    为了打开一个已存在的文件编辑,使用命令行”nano filename“,其中filename是已存在的文件的文件名。比如,打开一个包含最近发出的命令列表的文件,确保在你的主目录(home)下,并输入命令行”nano .bash_history“.如下所示:

    jeffsch@mandela:~ nano .bash_history

    在上面的例子中,如果文件.bash_history在你的当前目录下不存在,nano将会启动一个新的空白文件,并且使用 .bash_history作为它的文件名。


    警告

    默认情况下是自动换行的。当自动换行时,nano添加了行结束符在你的文件中以适应终端的宽度。

    3.2默认的nano屏幕布局


    底部的两行展示了常用操作的组合键。符号^代表键盘上的控制键。比如,使用Ctrl-G 组合键来显示nano的基本介绍和默认屏幕布局。

    屏幕的字体和背景颜色由你的终端设置决定。当你重新调整终端时,nano会调整本身。

    很长的行由符号$在终端窗口的右边的极端。符号$不是你文件中的一部分,它仅仅告诉你,在终端显示的文本行太长。

    3.3使用鼠标

    默认情况下,鼠标服务由终端窗口设置。鼠标的使用几乎和GUI编辑器一样。你可以突出显示文本,右键单击复制和粘贴,并使用鼠标中键从缓冲区粘贴文本。然而当你使用了中键来粘贴文本,文本被粘贴在了当前光标所在位置,而不是鼠标所指的地方。也有一些局限性。例如,你不能用鼠标剪切或者是删除文本,也不能用鼠标滚动到文本。

    Nano有自己内置的鼠标服务,但他们是有限的。他们只提供移动鼠标到你所点击的地方,和你标记开始和结束的文字。使用Alt-M组合键在终端鼠标服务和nano内置鼠标服务之间的切换。

    注意,

    如果你是在系统控制台使用的nano,你在使用鼠标前一定要安装和运行GPM。

    3.4使用键盘

    键盘将在当前光标位置插入文本。上、下翻页键,箭头键,插入键、删除键的使用就像在其他文本编辑器中一样。如果你的键盘没有这些键,那么你可以选择Ctr组合键。利用Ctrl-G组合键访问nano的在线帮助。

    粘贴、复制、剪切操作是有效的,但是他们不像大多数的GUI编辑器使用相同的Ctrl组合键。参考文本编辑了解更多信息。

    3.5打开、保存和关闭

    当你启动nano时可以打开一个文本编辑,就像在启动nano部分所讨论的那样。这一部分展示当nano已经启动时怎么打开一个文件。

    3.5.1打开文件

    与读文件命令打开一个文件,Ctrl+R。读文件的命令将一个文件从磁盘增加到当前光标所在位置。

    当出现提示时,输入你想要打开的文件名,或者使用Ctrl +T组合键使用nano内置的文件浏览器浏览你想打开的文件。

    如果一个文件已经打开,nano将会增加新的文件到当前光标所在位置;它不会关闭已存在的文件,也不会给新文件打开一个新的屏幕。

    3.5.2保存或另存

    保存或另存均与写命令来完成,Ctrl+O.但是我的机子却是使用Ctrl + Alt +O来保存。

    当出现提示时,按Enter键接受现有的文件名。另存为其他文件名,输入新的文件名并按回车键,是使用Ctrl+T组合键使用nano内置的文件浏览器。

    3.5.3关闭文件

    使用Ctrl+X组合键关闭文件。如果你正在编辑的文件从上次保存后被修改过,将会提示您保存文件,您可以输入Y保存文件,也可以输入N退出nano不保存文件。关闭文件也关闭了nano.但是我的电脑上却是使用Ctrl+Alt +X组合键关闭。(我的电脑是win7 虚拟机上安装的Ubuntu)。

    3.6编辑文件

    就像在大多数文本编辑器中一样,您输入的文本添加到当前光标所在位置。删除和后退键也像其他文本编辑器中一样。

    使用组合键Alt-6可以将文本复制到缓冲区。相似的,使用组合键Ctrl+K可以删除文本。如果没有突出的文本,那么这两个命令复制或剪切整个文本行。

    使用组合键Ctrl+U粘贴文本到当前缓冲文件中。

    剪切或复制明确的文本,你必须标记开始和要选择的文本的结束点。你可以使用键盘或鼠标,但是使用鼠标标记你必须首先打开nano的内置鼠标服务。

    使用键盘选择文本,要移动当前光标到你想要选择的文本开始处,按Alt+A组合键标记开始,然后移动光标到你想要选择的文本的结束点。

    使用鼠标标记选择的文本开始处,首先确保nano打开了鼠标服务。使用组合键Alt+M在nano鼠标了内置鼠标来回切换。点击你想要标记的开始处,移动到你想要的结束点,然后再次点击鼠标。你应该需要使用键盘在屏幕上向上或向下滚动,因为nano不支持鼠标滚动。

    3.7退出nano

    为了退出nano使用组合键Ctrl+X.如果你正在工作的文件在你上一次保存之后修改过,当你被提示时,可以保存,也可以不保存退出。

    展开全文
  • 纳米(NANO)价格代码和NanoCurrency周围的其他公用事业 NanoNano)由Colin LeMahieu以RaiBlocks的身份于2015年推出,Nano是一种低延迟的支付平台,需要的资源极少。 使Nano成为点对点交易的理想选择。 这是一个...
  • nano-docs:Nano协议的文档
  • NANO-S32:NANO S32操作系统
  • NANO-S16:NANO S16操作系统
  • List Nano (Nano)

    2021-01-08 16:40:05
    Nano </li><li> <p>Ticker NANO </li><li> <p>Block explorer URL nanode.co </li><li> <p>Additional technical requirements No </li><li> <p>Initial coin offering No </li></ol>该提问来源于开源项目:...
  • 1.Jetson Nano简介 2. Jetson Nano环境配置 2.1 开箱配件介绍 2.2 烧录系统 2.3 开机和基本设置 2.4 开发环境配置 2.4.1 更新源和软件 2.4.2 关屏时间设置 2.4.3安装中文输入法 2.4.4安装Code OSS 2.4.5...

    目录

    1. Jetson Nano简介

    2. Jetson Nano环境配置

    2.1 开箱配件介绍

    2.2 烧录系统

    2.3 开机和基本设置

    2.4 开发环境配置

    2.4.1 更新源和软件

    2.4.2 关屏时间设置

    2.4.3 安装中文输入法

    2.4.4 安装Code OSS

    2.4.5 安装Qt5

    3. 项目案例

    3.1 人脸检测

    3.1.1 安装pip

    3.1.2 安装Python常用机器学习包

    3.1.3 配置用于Python的Opencv

    3.1.4 基于Opencv的人脸检测

    3.2 二维码检测(制作扫码枪)

    3.2.1 读取摄像头

    3.2.2 二维码检测和识读

    4. 小结


     

    1. Jetson Nano简介

    Jetson Nano是一款体积小巧、功能强大的人工智能嵌入式开发板,于2019年3月由英伟达推出。预装Ubuntu 18.04LTS系统,搭载英伟达研发的128核Maxwell GPU,可以快速将AI技术落地并应用于各种智能设备。相比于Jetson之前的几款产品(Jetson TK1、Jetson TX1、Jetson TX2、Jetson Xavier),Jetson Nano售价仅需99美元,大幅减少了人工智能终端的研发成本。因此,一经推出,便受到了广泛的关注。其官网地址为:https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-nano/

    下面详细列举一些Jetson Nano的优势:

    (1) 体型小巧,性能强大,价格实惠,整体采用类似树莓派的硬件设计,支持一系列流行的AI框架,并且英伟达投入了大量的研发精力为其打造了与之配套的Jetpack SDK开发包,通过该开发包可以使学习和开发AI产品变得更加简单和便捷。

    (2) 专为AI而设计,性能相比树莓派更强大,搭载四核Cortex-A57处理器,128核Maxwell GPU及4GB LPDDR内存,可为机器人终端、工业视觉终端带来足够的AI算力。

    (3) 可提供472 GFLOP,支持高分辨率传感器,可以并行处理多个传感器,并可在每个传感器流上运行多个现代神经网络。

    (4) 支持英伟达的NVIDIA JetPack组件包,其中包括用于深度学习、计算机视觉、GPU计算、多媒体处理等的板级支持包,CUDA,cuDNN和TensorRT软件库。

    (5) 支持一系列流行的AI框架和算法,比如TensorFlow,PyTorch,Caffe / Caffe2,Keras,MXNet等,使得开发人员能够简单快速的将AI模型和框架集成到产品中,轻松实现图像识别,目标检测,姿势估计,语义分割,视频增强和智能分析等强大功能。

    目前人工智能风口开始逐步进入落地应用阶段,更多产品希望能够将人工智能算力运用于实际终端,即实现所谓的边缘计算需求。从根本上来说近几年推动人工智能的核心在于深度学习算法,但是深度学习的推理加速离不开高速GPU的支持,而一般桌面PC或服务器级别的显卡(如英伟达1080Ti等)价格非常昂贵,不适合边缘计算需求,而且体积也过于庞大。因此,英伟达推出的这款嵌入式人工智能开发板Jetson Nano非常契合当前行业需求。

    2. Jetson Nano环境配置

    2.1 开箱配件介绍

    直接购买的Jetson Nano仅包含一台裸机,如下图所示:

    下图显示了Jetson Nano裸机的各个接口:

    • 接口1:SD卡插槽,在背面插入,拔出时只要轻按一下即可。SD卡主要用来存储整个系统以及相关数据,类似于桌面PC硬盘的作用;
    • 接口2:  40个pin角的GPIO接口,主要用于连接外部设备,如温控器、水平仪等;NVIDIA官方提供了了JetsonGPIO库(Python)可以方便的来控制GPIO,Jetson.GPIO库运用了跟树莓派RPi.GPIO库一样的API。
    • 接口3:USB口的5V输入源,默认使用该接口作为电源输入;该接口也可以作为数据传输线,例如高速串口等;
    • 接口4:有线网口;如果不够买无线网卡的话可以直接将网线接在该口上进行连网;
    • 接口5:  4个USB3.0口,用于接入USB设备,例如USB型摄像头;
    • 接口6:HDMI输出端口,可以用来接显示屏;
    • 接口7:DP显示接口,可以用来接显示屏;(接口6和接口7都是用来接外设显示屏的,只是接口不同而已,实际使用时只采用一个即可,通常一般用HDMI接口)。如果想接VGA显示屏,可以购买一个HDMI转VGA的转换口然后使用接口6即可;
    • 接口8: 直流5V输入电源;注意,Jetson Nano的电源输入方式有两种,一种是采用接口3的方式,只需要购买个5V的安卓手机充电器插上即可使用,这也是默认方式。另一种就是使用接口8,此时需要对J48进行短接,短接完成后就可以切换成接口8进行电源输入,如下图所示:

    • 接口9: MIPI CSI 摄像头,可以直接购买用于树莓派的摄像头即可使用;

    除了裸机以外,还需自行购买内存卡、键盘、鼠标、5V2A直流电源、显示器、无线网卡、摄像头、风扇、外壳等配件才能更好的进行开发,这些配件均可以在网上方便的够得。

    下面对部分配件选型和安装进行说明。

    • 内存卡:一般内存卡有16G、32G、64G、128G等,为了方便后期深度学习开发,建议选用32G及以上内存卡。

    • 键盘鼠标可以直接使用支持USB3.0即可;
    • 电源选择5V2A或5V3A电源,如下图所示。主要,如果采用下图所示电源接入方法,需要将J48连接才可,否则默认电源输入是通过USB方式接入。

    • 显示器:建议使用HDMI的显示器直接连接,如果要接电脑VGA显示器,则可以购买一个HDMI转VGA的转换模块完成连接

    • 无线网卡:联网可以采用有线和无线两种方式,通过接口4直接连上网线就可以上网。如果需要采用无线wifi上网方式,则需要单独购买无线wifi模块。建议购买Jetson Nano的标准配套无线Wifi模块,如下图所示,主要包括一对对偶天线和一个处理芯片,其兼容性可以得到保证。

    该无线WIFI的安装稍微麻烦一些,需要拆卸裸机上的GPU部件。

    首先将wifi两个天线连接到处理芯片上,在卡槽上按压即可将天线卡上,如下图所示:

    然后按照下图所示方式将Jetson Nano裸机上的GPU组件拆卸下来:

    卸下来以后将wifi芯片安装在卡槽中,如下图所示:

    然后再重新安装上GPU组件,安装的时候要注意不要卡住两个天线的连接线。

    • 摄像头:摄像头可以采用两种方式,一种是直接使用树莓派的CSI摄像头,还有就是使用USB摄像头。如果使用树莓派摄像头,则按照下图所示方式接入即可(注意正反面):

    • 风扇:一般情况下,不需要使用风扇对Jetson Nano进行散热处理,但是如果用到深度学习技术,并且高频率的进行推理运算,那么最好需要在GPU组件上面加装一个散热风扇,如下图所示:

    • 外壳:裸露的开发板容易短路,从安全性考虑,在安装完上述配件以后最好为整个Jetson Nano安装一个外壳。外壳种类多样,可以根据实际购买的外壳说明进行安装,下图是一种较为常见的Jetson Nano透明外壳:

     

    2.2 烧录系统

    英伟达官方为Jetson Nano提供了SD卡版本的系统镜像,并且一直在更新和维护,该镜像中包含对应的Ubuntu系统以及配置好的cuda环境和opencv环境,因此只需要下载和安装该镜像即可完成Jetson Nano的大部分环境配置。可以直接到官网进行镜像下载,下载地址为:https://developer.nvidia.com/embedded/downloads,双击Image下载最新的镜像即可,如下图所示:

    本文下载的是2019年12月17日更新的JP4.3版本镜像,下载下来的是一个zip压缩包,将该zip压缩包进行解压,可以得到后缀为img的文件,该文件即为我们需要的镜像文件。该镜像文件总共占大概12.5G空间,所有这些内容最后都需要存储在SD卡中,因此,建议选择容量较大的SD卡较佳,如64G或128G。一般情况下,如果SD卡是新的,可以直接烧写,但是有时候会需要对旧的SD卡重新烧写,这时候就需要预先对SD卡做一下格式化,避免在镜像过程中出错。如果之前是已经烧写过Jetson Nano镜像的SD卡,那么就需要先对SD卡进行分区删除和重新合并,这是因为经过Jetson Nano烧写过的SD卡会形成12个子分区,因此需要先用磁盘管理器对这些分区进行删除和合并,再进行新的镜像烧写(如果是新的SD卡则不需要这些操作),如下图所示:

    如上图所示,旧的Jetson Nano镜像卡会形成12个子分区,对照上图中的磁盘2的12个分区,依次进行“删除卷”处理,然后为磁盘2重新“新建简单卷”,

    如果是新的SD卡,则只需要格式化以下即可。接下来开始正式进行烧录。烧录工具很多,本文推荐使用Win32DiskImager,该工具可以直接在网上进行下载和安装。双击打开Win32DiskImager,选择刚才的img镜像,并配置好对应的SD卡盘符,如下图所所示:

    单击“写入”即可完成镜像烧录,整个烧录时间大概在15分钟左右。

    2.3 开机和基本设置

    完成烧录后将SD卡插入到Jetson Nano背面的卡槽中,然后开机启动。

    初次安装需要进行基本的配置,包括账户密码、Wifi密码、输入法、时区等,具体根据提示完成即可,配置完成后会默认进行一次更新操作Applying Changes,此更新需要联网,如果没有联网则先单击cancel取消等后面联网了再进行手动更新。更新时间较长,等待即可。最后会进入桌面,如下图所示:

     

    2.4 开发环境配置

    2.4.1 更新源和软件

    安装完系统后首先应该更新源,否则后续更新和升级会非常慢。但是由于Jetson Nano采用的是aarch64架构的Ubuntu 18.04.2 LTS系统,与AMD架构的Ubuntu系统不同,因此需要替换成aarch64的源,这里一定要注意,不要替换成x86-64的源了。

    我们这里选择清华的源进行更新。首先备份原本的源,更改source.list文件的名字,以备不时之需:

    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak    
    sudo gedit /etc/apt/sources.list

    然后删除所有内容,复制以下内容:

    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe
    deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
    deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
    deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
    deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe

    到这里换源就结束了。

    打开终端,输入下述命令进行更新:

    sudo apt-get update
    sudo apt-get full-upgrade

    上述更新时间较长,中间可能由于网速的关系会更新失败,此时不要关机重新执行命令即可,会自动断点续传的。

     

    2.4.2 关屏时间设置

    Jetson Nano默认5分钟内不操作Jetson即会关闭屏幕,重新开启屏幕需要重新输入开机密码。由于在开发Jetson Nano的过程中经常需要等待,因此并不希望频繁的开启屏幕,而是希望屏幕一直打开。打开System Settings进入系统设置界面,如下图所所示:   

    单击Brightness & Lock,然后将 Turn screen off when inactive for 改为 Never即可,如下图所示:

     

    2.4.3 安装中文输入法

    由于在开发过程中经常需要使用中文搜索以及书写必要的中文注释,所以推荐为系统安装中文输入法。Jetson Nano自带ibus中文输入法,但是要简单的配置下才能进行中文的输入。在终端中直接输入命令ibus会出现下图所示界面,说明Jetson Nano已经自带了ibus输入法环境了。

    下面为ibus下载拼音输入法,输入命令:

    sudo apt-get install ibus-pinyin

      上述下载和安装大概需要数十分钟的时间。安装完成后进入系统配置System Settings界面,选择语言支持选项Language Support ,如下图所示:

       然后选择“添加或删除语言”界面,会系统选择语言支持,如下图所示:

          此处选择“中文简体”然后单击Apply即可。这个Apply过程会安装一系列中文语言包,如下图所示:

    安装完成后在语言支持界面将汉语调整到最前面,如下图所示:

    然后单击“应用到整个系统”。最后将“键盘输入法系统”改为iBus即可。

    重新启动系统(很重要!!!),然后在终端中输入下述命令进入ibus配置界面:

     ibus-setup

    在配置界面中单击“添加”按钮,然后展开“汉语”选项,选择Intelligent Pinyin。这里如果找不到“汉语”选项则可以先关机重启,再重新查找。

    添加完成后输入下面的命令重启ibus即可。

    ibus restart

    最后,将桌面顶任务栏中将输入法切成拼音输入法Pi,如下图所示:

    此时就可以使用中文输入了。如下所示:

    2.4.4 安装Code OSS

    Visual Studio Code(VS Code)是一个免费的集成开发环境(IDE),适用于Windows,Mac和Linux。VS Code近年来获得了越来越多的关注,成为广大编程开发者的首选编译环境。它作为微软推出的开源项目,吸引了无数第三方开发者和终端用户,成为顶尖开源项目之一。它功能强大、速度快,更在拥有海量插件的情况下做到了简洁流畅的用户体验,属于一款非常优秀的IDE。

    原生的VS Code并不适用于Jetson Nano,当前,还没有针对Jetson Nano这样的ARM设备的VS Code正式版本。但是,由于它是开源的,所以任何人都可以编译一个版本。其中,Code-OSS就是这样一款嵌入式环境下的“VS Code”。Code-OSS基于VS Code,它并不仅仅是一个代码编辑器,它具有用于管理整个项目文件夹而不是单个脚本的内置资源管理器功能以及丰富的第三方插件。实际上Code-OSS几乎具备了VS Code的所有完整功能,因此用它作为代码编辑器来编辑代码,例如python,会使得整个开发过程更加便捷。下面讲解具体的安装方法。

    打开Chromiun浏览器,输入网址:

    点击Packsges,查看列出来的包名,选择后缀带有arm64(aarch64)的,如下图所示:

    单击后进入详情页面,找到对应的wget命令,如下图所示:

    该命令演示了如何下载该安装包,具体如下:

    wget --content-disposition https://packagecloud.io/headmelted/codebuilds/packages/debian/stretch/code-oss_1.42.0-1575969886_arm64.deb/download.deb

    将该命令复制到终端中实现安装包下载。如下图所示:

    此时,安装包已经下载到home根目录下,可以通过文件资源管理器查看下载的deb安装包,如下所示:

    在终端中输入下述命令完成最终的安装:

    sudo dpkg -i code-oss_1.42.0-1575969886_arm64.deb

    安装完成后从可以在搜索中搜索Code OSS,会弹出Code OSS应用程序,这个即为我们需要的Python编程IDE。单击应用程序打开如下图所示:

    下面简单演示下如何使用Code OSS执行Python脚本。

    首先在Code OSS中安装Python插件,其插件安装方法和普通的VS Code完全相同,不熟悉VS Code的读者可以先在桌面PC上熟悉VS Code基本用法再切换到Jetson Nano环境中来。插件安装如下图所示,在Extensions面板中搜索python,选择第一个弹出的插件进行安装即可:

    接下来在home目录下新建一个code文件夹,该文件夹用于存放Python代码脚本。然后在Code OSS中打开刚才创建的code文件夹,然后新建一个文件,按ctrl+s键保存文件,将文件命名为main.py,然后输入下面的代码:

    a = 36
    b = 64
    print(a+b) 

    然后按ctrl+F5键即可运行脚本,效果如下:

    至此,已完成Python编辑器的安装和运行。

    2.4.5 安装Qt5

    在实际的产品部署阶段,考虑到终端设备速度、稳定性、内存占用等因素,一般会采用C++来开发最终的成品,而只有在产品模型设计阶段才会使用python进行算法开发。因此,需要一款能够在Jetson Nano中开发C++的编译器方便我们开发落地产品。VS Code本身可以开发C++应用,但是Code-OSS对于C++的支持并不好,因此,需要另外安装一个优秀的C++编译器来完成C++开发任务。本文推荐使用Qt。

    Qt是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。Qt 是纯 C++ 开发的,所以用它来开发C++应用具有天然的优势。Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统 Android、iOS、WinPhone以及嵌入式系统 QNX、VxWorks 等等。当然,QT也完全支持Jetson Nano的Ubuntu环境。

    Jetson Nano下安装QT比较简单,只需要输入命令:

    sudo apt-get install qt5-default qtcreator -y

    此时安装的是Qt5.9.5版本。

    安装完成后,同样在搜索菜单中搜索Qt,然后会出现Qt Creator,这个即为Qt的IDE,打开它。接下来简单演示如何创建一个简单的C++控制台程序。

    打开Qt Creator,如下图所示:

    单击New Project创建一个新项目,这里选择Application 下的Qt COnsole Appliation应用,即创建一个Qt版的C++控制台程序:

    然后工程命名为QTtest:

    然后一直默认单击下一步即可完成项目的创建。可以看到,Qt已经为我们创建了一个C++文件main.cpp用于编写C++代码,并且还有一个QTtest.pro配置文件用于为整个项目进行配置,效果如下图所示:

    此时可以直接按ctrl+r键运行项目,但是由于我们并没有任何输出代码,所以弹出的终端也没有输出任何值。我们修改一下main.cpp的代码,同样来执行两个整数的相加并输出其结果,完成代码如下:

    #include <QCoreApplication>
    #include <QtDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        int c=64;
        int d=36;
        qDebug() << (c+d);
        return a.exec();
    }

    此时,再重新按ctrl+r键运行项目输出下图所示结果:

    Qt Creator的详细使用请读者自行学习相关教程,这部分资源很多也很成熟,对于开发实际的嵌入式产品来说掌握Qt和C++的使用是一个必要的过程。本文不再对Qt尤其是Qt的界面编程作深入介绍。

    最后我们再看一下在主目录下生成了一个与QTtest对照的debug可执行项目build-QTtest-unknown-Debug,在这个文件夹中生成来debug版本的QTtest可执行程序。通过终端cd命令进入到该文件夹,然后输入

    ./QTtest

    会直接执行程序,如下图所示:

    也就是说本质上我们已经成功的部署开发了一个应用,该应用功能很简单,仅仅实现了两个固定整数的相加。尽管简单,但是却梳理了我们正常开发人工智能产品的一种比较常见的形式,即先在VS Code中用python脚本进行算法验证,最后再用QT编写对应的C++应用,最后生成二进制可执行程序,这个最终生成的二进制可执行程序就是我们的“产品”,这个可执行程序代码是封装起来的、不可见的、可以直接运行的。

    至此,我们已经完成了Jetson Nano的常规开发配置,接下来会进行几个小项目的演示,使读者可以更深入的学习Jetson Nano的开发方法。

    3. 项目案例

    3.1 人脸检测

    本节首先使用Python来完成人脸检测算法,其中会讲解Python配置和使用Opencv的基本方法以及一些常用python库的安装。

    3.1.1 安装pip

    由于Jetson Nano中已经预装了Python3.6版本,所以可以直接安装pip。

    在终端中输入下述命令进行安装:

    sudo apt-get install python3-pip python3-dev

    安装完成后此时的pip是9.01版本,需要对pip进行一下升级,否则后面在安装其它Python库的时候会出问题。升级命令如下:

    python3 -m pip install --upgrade pip

    升级后版本为19.0.3。尽管完成了升级,但是这时候pip3有个小bug需要手动修复一下。

    首先使用下面的命令打开pip3文件:

    sudo vim /usr/bin/pip3

    键盘输入字符a进入插入模式,然后可以开始编辑文件,将:

    from pip import main
    if __name__ == '__main__':
        sys.exit(main())

    修改为:

    from pip import __main__
    if __name__ == '__main__':
        sys.exit(__main__._main())

    然后按Esc键进入到命令模式。最后按英文的":"键进入末行模式,敲入wq按回车即可保存修改并退出编辑器。

    3.1.2 安装Python常用机器学习包

    sudo apt-get install python3-scipy
    sudo apt-get install python3-pandas
    sudo apt-get install python3-sklearn

    3.1.3 配置用于Python的Opencv

    有两种方法安装python下的opencv。一种是下载Opencv源码并且重新编译生成对应的python包,然后将该包拷贝到python的安装包路径中;另一种就是直接使用命令 sudo pip3 install python3-opencv。需要注意的是,第二种方式本质上安装的是已经编译好的opencv包,其opencv的版本是固定的,如果想要使用最新的opencv,比如opencv4,那么第二种方法就不合适。本小节先简单的采用第一种方式来安装。

    原镜像中已经预装了opencv4.1.1,可以使用下述命令来查看当前Opencv版本号:

    opencv_version

    输出结果如下图所示:

    因此,我们也不需要重新进行编译,直接使用即可。

    3.1.4 基于Opencv的人脸检测

    (1)python实现人脸检测

    本小节首先编写一个python脚本用于检测图像中的人脸,使用Code OSS打开2.4.4节中创建的code文件夹,在该文件夹下新建一个python脚本,名为face_detect_test.py,代码如下所示:

    import cv2 
    filepath = "test.jpg" 
    img = cv2.imread(filepath) # 读取图片 
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换灰色 
    # OpenCV人脸识别分类器 
    classifier = cv2.CascadeClassifier( "haarcascade_frontalface_default.xml" ) 
    color = (0, 255, 0) # 定义绘制颜色 
    # 调用识别人脸 
    faceRects = classifier.detectMultiScale( gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32)) 
    if len(faceRects): # 大于0则检测到人脸 
        for faceRect in faceRects: # 单独框出每一张人脸 
            x, y, w, h = faceRect 
            # 框出人脸 
            cv2.rectangle(img, (x, y), (x + h, y + w), color, 2) 
    cv2.imshow("image", img) # 显示图像 
    c = cv2.waitKey(10) 
    cv2.waitKey(0) 
    cv2.destroyAllWindows()

    上述代码中filepath用于存放当前需要检测的图像路径,一般可以放在与源文件同目录下即可。在构造opencv人脸检测分类器时,需要对应的人脸检测配置文件,该文件存储了用于人脸检测算法的相关参数,此文件可以从opencv的安装目录找到:/usr/share/opencv4/。找到后将其拷贝到源文件目录下即可。

    按ctrl+F5运行,效果图如下所示:

    (2)C++实现人脸检测

    本小节编写一个C++应用,用于检测图像中的人脸,使用Qt5进行开发。相关实现方法与python版相同。主要讲解如何在QT下集成Opencv进行C++项目开发。

    C++下开发Opencv需要进行一些额外的配置,先看一下opencv的位置。Jetson Nano预装的Opencv4.1.1的头文件位置如下图所示:

    库文件放置在:  

    /usr/lib/aarch64-linux-gnu

    因此,只需要在Qt的pro文件中将上述两个目录包含进来即可。

    用Qt Creator重新打开2.4.5节创建的QTtest项目,编辑QTtest.pro文件如下:

    QT -= gui
    
    CONFIG += c++11 console
    CONFIG -= app_bundle
    CONFIG += C++11  # 添加对C++11的支持
    
    # The following define makes your compiler emit warnings if you use
    # any feature of Qt which as been marked deprecated (the exact warnings
    # depend on your compiler). Please consult the documentation of the
    # deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    
    # You can also make your code fail to compile if you use deprecated APIs.
    # In order to do so, uncomment the following line.
    # You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    INCLUDEPATH += /usr/include/opencv4 #添加头文件路径
    
    LIBS += -L/usr/lib/aarch64-linux-gnu -lopencv_core -lopencv_imgcodecs -lopencv_imgproc -lopencv_highgui -lopencv_objdetect  #添加需要链接的库
    
    
    SOURCES += main.cpp
    

    其中重点需要注意头文件和lib文件的添加方法。

    接下来修改main.cpp文件,代码如下:

    #include <iostream>
    #include <string>
    #include <opencv4/opencv2/opencv.hpp>
    #include <opencv4/opencv2/core.hpp>
    #include <opencv4/opencv2/highgui.hpp>
    #include <opencv4/opencv2/imgproc.hpp>
    #include <opencv4/opencv2/objdetect.hpp>
    #include <opencv4/opencv2/imgproc/types_c.h>
    
    
    using namespace std;
    using namespace cv;
    int main( int argc, char** argv )
    {
        std::string filepath( "test.jpeg" );
        Mat img,gray;
        img = imread( filepath, IMREAD_COLOR );
        cvtColor(img, gray, CV_BGR2GRAY);
    
        CascadeClassifier classifier;
        classifier.load("haarcascade_frontalface_default.xml");
        Scalar color=Scalar(0, 255, 255);
    
        vector<Rect> faceRects;
        classifier.detectMultiScale(gray,faceRects,1.2,3,0,Size(32,32));
    
        for (size_t i = 0; i < faceRects.size(); i++)
        {
            rectangle(img, faceRects[i], color);
        }
    
        namedWindow( "Display window", WINDOW_AUTOSIZE );
        imshow( "Display window", img);
        waitKey(0);
        return 0;
    }
    

    重新生成整个项目,然后将test.jpeg和haarcascade_frontalface_default.xml文件放置在编译生成的build-QTtest-unknown-Debug文件夹中,运行项目效果图如下所示:

     

    3.2 二维码检测(制作扫码枪)

    现在支付宝和微信广泛使用二维码作为支付手段,在现实生活购物中我们经常会通过手机展示二维码给商家用于扫码,那么我们是否可以自行做一个扫码仪呢?有了Jetson Nano这款嵌入式人工智能开发板,我们就可以自己制作一个扫码枪。

    3.2.1 读取摄像头

    本小节我们希望能够通过摄像头读取图像,并且对图像中的二维码进行实时解析,也就是实现一个扫码仪的功能。本小节实现摄像头读取功能。摄像头一般有两种可选,一种是相对价格比较便宜的csi摄像头(树莓派摄像头),还有一种是USB摄像头。值得注意的是,如果采用USB摄像头,那么图像的读取和渲染则是会用到Jetson Nano的GPU,如果这个时候我们还在做一些深度学习的推理工作,那么很明显会占用掉一些GPU资源。相反,Jetson Nano对于csi摄像头的读取和渲染则会采用Gstreamer管道来处理,会使用特定的硬件加速,整个处理效果会更好。

    本小节我们将详细介绍两种摄像头的读取方式。无论哪种方式,我们均采用Opencv这个强大的图像处理开源库作为基础来执行相关操作。

    (1)读取CSI摄像头

    使用Gstreamer读取CSI摄像头主要分为3个步骤:创建Gstreamer管道;将管道绑定opencv的视频流;逐帧提取和显示。下面首先给出基于Python的详细代码:

    import cv2
    
    # 设置gstreamer管道参数
    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,
            )
        )
    
    
    if __name__ == "__main__":
        capture_width = 1280
        capture_height = 720
        display_width = 1280
        display_height = 720
        framerate = 60
        flip_method = 0
    
        # 创建管道
        print(gstreamer_pipeline(capture_width,capture_height,display_width,display_height,framerate,flip_method))
    
        #管道与视频流绑定
        cap = cv2.VideoCapture(gstreamer_pipeline(flip_method=0), cv2.CAP_GSTREAMER)
    
        if cap.isOpened():
            window_handle = cv2.namedWindow("CSI Camera", cv2.WINDOW_AUTOSIZE)
            
            # 逐帧显示
            while cv2.getWindowProperty("CSI Camera", 0) >= 0:
                ret_val, img = cap.read()
                cv2.imshow("CSI Camera", img)
    
                keyCode = cv2.waitKey(30) & 0xFF         
                if keyCode == 27:# ESC键退出
                    break
    
            cap.release()
            cv2.destroyAllWindows()
        else:
            print("打开摄像头失败")
    

    紧接着3.1.4节中的第一部分内容,在Code-OSS中新建一个文件命名为csi_camera_test.py,然后将上述代码复制到该文件中,保存然后按ctrl+F5运行脚本(前提:确保已经准确安装了CSI树莓派摄像头),运行效果如下所示:

    可以看到已经可以正常的显示视频流图像了,但是由于树莓派摄像头本身的原因,其图像中还有很多的噪点,颜色也有些失真(真实工业场景中建议购买更好的摄像头)。下面我们同步的给出C++版本。紧接着3.1.4节中第二部分内容,修改main.cpp文件如下:

    #include <iostream>
    #include <string>
    #include <opencv4/opencv2/opencv.hpp>
    #include <opencv4/opencv2/core.hpp>
    #include <opencv4/opencv2/highgui.hpp>
    #include <opencv4/opencv2/imgproc.hpp>
    #include <opencv4/opencv2/objdetect.hpp>
    #include <opencv4/opencv2/imgproc/types_c.h>
    #include <opencv4/opencv2/videoio.hpp>
    
    using namespace std;
    using namespace cv;
    
    string gstreamer_pipeline (int capture_width, int capture_height, int display_width, int display_height, int framerate, int flip_method)
    {
        return "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=(int)" + to_string(capture_width) + ", height=(int)" +
               to_string(capture_height) + ", format=(string)NV12, framerate=(fraction)" + to_string(framerate) +
               "/1 ! nvvidconv flip-method=" + to_string(flip_method) + " ! video/x-raw, width=(int)" + to_string(display_width) + ", height=(int)" +
               to_string(display_height) + ", format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink";
    }
    
    int main( int argc, char** argv )
    {
        int capture_width = 1280 ;
        int capture_height = 720 ;
        int display_width = 1280 ;
        int display_height = 720 ;
        int framerate = 60 ;
        int flip_method = 0 ;
    
        //创建管道
        string pipeline = gstreamer_pipeline(capture_width,
        capture_height,
        display_width,
        display_height,
        framerate,
        flip_method);
        std::cout << "使用gstreamer管道: \n\t" << pipeline << "\n";
    
        //管道与视频流绑定
        VideoCapture cap(pipeline, CAP_GSTREAMER);
        if(!cap.isOpened())
        {
            std::cout<<"打开摄像头失败."<<std::endl;
            return (-1);
        }
    
        //创建显示窗口
        namedWindow("CSI Camera", WINDOW_AUTOSIZE);
        Mat img;
    
        //逐帧显示
        while(true)
        {
            if (!cap.read(img))
            {
                std::cout<<"捕获失败"<<std::endl;
                break;
            }
            imshow("CSI Camera",img);
    
            int keycode = cv::waitKey(30) & 0xff ; //ESC键退出
                if (keycode == 27) break ;
        }
    
        cap.release();
        destroyAllWindows() ;
    }

    其中需要额外的添加opencv用于视频处理的头文件#include <opencv4/opencv2/videoio.hpp>。另外,还需要修改对pro文件,将视频处理对应的opencv_videoio库包含进来,完整的pro文件如下:

    QT -= gui
    
    CONFIG += c++11 console
    CONFIG -= app_bundle
    CONFIG += C++11  # 添加对C++11的支持
    
    # The following define makes your compiler emit warnings if you use
    # any feature of Qt which as been marked deprecated (the exact warnings
    # depend on your compiler). Please consult the documentation of the
    # deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    
    # You can also make your code fail to compile if you use deprecated APIs.
    # In order to do so, uncomment the following line.
    # You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    INCLUDEPATH += /usr/include/opencv4 #添加头文件路径
    
    LIBS += -L/usr/lib/aarch64-linux-gnu -lopencv_core -lopencv_imgcodecs -lopencv_imgproc -lopencv_highgui -lopencv_objdetect -lopencv_videoio  #添加需要链接的库
    
    
    SOURCES += main.cpp
    

    保存所有修改后重新构建项目并运行可以得到相同的结果,视频可以正确显示。

    (2)读取USB摄像头

    相比于读取CSI摄像头,读取USB摄像头更加简单,只需要两步:打开摄像头;逐帧提取。但是需要注意的是Jetson Nano并不是支持所有的USB摄像头,建议在采购的时候尽量选择Linux免驱的USB摄像头。本文采用的是一个4K高清摄像头。

    下面给出Python版本的完整代码:

    import cv2
     
     #创建摄像头捕获模块
    cap = cv2.VideoCapture(1)
    
    #创建窗口
    window_handle = cv2.namedWindow("USB Camera", cv2.WINDOW_AUTOSIZE)
    
    # 逐帧显示
    while cv2.getWindowProperty("USB Camera", 0) >= 0:
        ret_val, img = cap.read()
        print(img.shape)
        
        # 图像太大需要调整
        height, width = img.shape[0:2]
        if width>800:
            new_width=800
            new_height=int(new_width/width*height)
            img = cv2.resize(img, (new_width,new_height))
     
        cv2.imshow("USB Camera", img)
    
        keyCode = cv2.waitKey(30) & 0xFF         
        if keyCode == 27:# ESC键退出
            break
    
    #释放资源
    cap.release()
    cv2.destroyAllWindows()

    上述代码在打开摄像头时使用了cap = cv2.VideoCapture(1),这里的参数1是因为当前的Jetson Nano还连接了CSI摄像头,CSI摄像头的标识为0,因此这个USB摄像头的标识为1,这个可以在实际使用时通过测试来得到。另外,上述代码中对图像的尺寸做了限制,如果宽度超过800,则等比的缩放图像再显示。效果图如下所示:

    可以看到这个USB 4K摄像头对于图像的显示效果还是不错的,颜色更加真实,噪点少。后面我们会继续使用这个摄像头进行二维码检测。

    下面给出C++版本代码,修改main.cpp文件,代码如下:

    #include <iostream>
    #include <string>
    #include <opencv4/opencv2/opencv.hpp>
    #include <opencv4/opencv2/core.hpp>
    #include <opencv4/opencv2/highgui.hpp>
    #include <opencv4/opencv2/imgproc.hpp>
    #include <opencv4/opencv2/objdetect.hpp>
    #include <opencv4/opencv2/imgproc/types_c.h>
    #include <opencv4/opencv2/videoio.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main( int argc, char** argv )
    {
        //打开摄像头
        VideoCapture cap(1);
    
        //创建显示窗口
        namedWindow("USB Camera", WINDOW_AUTOSIZE);
        Mat img;
    
        //逐帧显示
        while(true)
        {
            if (!cap.read(img))
            {
                std::cout<<"捕获失败"<<std::endl;
                break;
            }
            int new_width,new_height,width,height,channel;
            width=img.cols;
            height=img.rows;
            channel=img.channels();
            cout<<width<<"  "<<height<<"  "<<channel<<endl;
    
            new_width=800;
            if(width>800)
            {
                new_height=int(new_width*1.0/width*height);
            }
    
            resize(img, img, cv::Size(new_width, new_height));
            imshow("USB Camera",img);
    
            int keycode = cv::waitKey(30) & 0xff ; //ESC键退出
                if (keycode == 27) break ;
        }
    
        cap.release();
        destroyAllWindows() ;
    }
    

    效果如下所示:

     

    3.2.2 二维码检测和识读

    本小节将使用Opencv实现二维码检测和识读功能。在opencv4.0以后,已经集成了二维码识读模块,因此,我们可以采用最新的opencv来实现二维码检测和识读。二维码检测和识别主要分为3步:使用QRCodeDetector()函数创建二维码检测器;使用detectAndDecode函数对图像进行二维码检测和识别;将检测结果输出。

    这里主要是读取视频流的每帧图像然后对图像进行检测,为了方便,我们仅给出针对USB摄像头的完整实例,对于CSI摄像头可以根据3.2.1节内容将相关二维码检测代码迁移过去即可。结合3.2.1节中获取USB摄像头视频的代码,给出完整的Python版二维码检测和识读代码:

    import cv2
    import numpy as np
     
     #创建摄像头捕获模块
    cap = cv2.VideoCapture(1)
    
    #创建窗口
    window_handle = cv2.namedWindow("USB Camera", cv2.WINDOW_AUTOSIZE)
    
    #创建二维码检测器
    qrDecoder = cv2.QRCodeDetector()
    
    # 逐帧显示
    while cv2.getWindowProperty("USB Camera", 0) >= 0:
        ret_val, img = cap.read()
        #print(img.shape)
        
        # 图像太大需要调整
        height, width = img.shape[0:2]
        if width>800:
            new_width=800
            new_height=int(new_width/width*height)
            img = cv2.resize(img, (new_width,new_height))
    
        # 二维码检测和识别
        data,bbox,rectifiedImage = qrDecoder.detectAndDecode(img)
        if len(data)>0:
            print("解码数据 : {}".format(data))
            n = len(bbox)
            for j in range(n):
                cv2.line(img, tuple(bbox[j][0]), tuple(bbox[ (j+1) % n][0]), (255,0,0), 3)
        else:
            print("没有检测到二维码")
    
        #显示图像
        cv2.imshow("USB Camera", img)
    
        keyCode = cv2.waitKey(30) & 0xFF         
        if keyCode == 27:# ESC键退出
            break
    
    #释放资源
    cap.release()
    cv2.destroyAllWindows()

    效果图如下:

    C++版本完整代码如下:

    #include <iostream>
    #include <string>
    #include <opencv4/opencv2/opencv.hpp>
    #include <opencv4/opencv2/core.hpp>
    #include <opencv4/opencv2/highgui.hpp>
    #include <opencv4/opencv2/imgproc.hpp>
    #include <opencv4/opencv2/objdetect.hpp>
    #include <opencv4/opencv2/imgproc/types_c.h>
    #include <opencv4/opencv2/videoio.hpp>
    #include <opencv4/opencv2/imgcodecs.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main( int argc, char** argv )
    {
        //打开摄像头
        VideoCapture cap(1);
    
        //创建显示窗口
        namedWindow("USB Camera", WINDOW_AUTOSIZE);
        Mat img;
    
        //创建二维码检测器
        QRCodeDetector qrDecoder = QRCodeDetector();
    
        //逐帧显示
        while(true)
        {
            if (!cap.read(img))
            {
                std::cout<<"捕获失败"<<std::endl;
                break;
            }
            int new_width,new_height,width,height,channel;
            width=img.cols;
            height=img.rows;
            channel=img.channels();
            //cout<<width<<"  "<<height<<"  "<<channel<<endl;
    
            //调整图像大小
            new_width=800;
            if(width>800)
            {
                new_height=int(new_width*1.0/width*height);
            }
            resize(img, img, cv::Size(new_width, new_height));
    
            //二维码检测和识读
            Mat bbox, rectifiedImage;
            std::string data = qrDecoder.detectAndDecode(img, bbox, rectifiedImage);
            if(data.length()>0)
            {
                cout << "解码数据: " << data << endl;
    
                int n = bbox.rows;
                for(int i = 0 ; i < n ; i++)
                {
                    line(img, Point2i(bbox.at<float>(i,0),bbox.at<float>(i,1)), Point2i(bbox.at<float>((i+1) % n,0), bbox.at<float>((i+1) % n,1)), Scalar(255,0,0), 3);
                }
            }
            else
                cout << "没有检测到二维码" << endl;
    
            imshow("USB Camera",img);
    
            int keycode = cv::waitKey(30) & 0xff ; //ESC键退出
                if (keycode == 27) break ;
        }
    
        cap.release();
        destroyAllWindows() ;
    }

    效果如下图所示:

     

    4. 小结

    本篇博客从Jetson Nano的安装开始讲解,一直到开发人脸检测、二维码扫码枪等案例结束。本教程更多的从实际使用出发,从嵌入式产品理念教会读者如何一步步搭建人工智能产品,每个案例均包括python和c++两种版本。为了适应新读者上手,选取的案例都比较简单。从实际情况出发,目前人工智能更多的采用深度学习进行高精度的推理运算,采用深度学习较传统算法可以大幅提高图像检测、识别和语义分割精度,但是如何将深度学习算法有效落地成了当前最热门的风口,即如何高效的实现所谓的边缘计算。Jetson Nano作为英伟达推出的人工智能开发板,用其作为深度学习嵌入式的落地平台非常合适,尤其是结合英伟达推出的TensorRT开发包,可以将各类深度学习框架训练出来的模型进一步的加速推理。从英伟达公布的数据分析,使用TensorRT可以加速推理3倍以上时间。因此,未来使用Jetson Nano的一个重点方向就是深度学习的落地应用。

    后面本教程会持续更新Jetson Nano深度学习相关内容。

    展开全文
  • List Nano (NANO)

    2021-01-08 17:33:58
    <div><p>Official project URL: https://nano.org</p> <p>Official block explorer URL: https://www.nanode.co</p><p>该提问来源于开源项目:bisq-network/bisq</p></div>
  • YOLO-Nano 受NanoDet启发的新版YOLO-Nano。 在这个项目中,您可以享受: YOLO-Nano的其他版本 网络 这与PyTorch构建的YOLO-Nano不同: 骨干网:ShuffleNet-v2 颈部:非常轻巧的FPN + PAN 火车 批量大小:32 ...
  • Nano100 : 06_Nano100 PWM.pdf

    2019-09-15 12:40:01
    NuMicro Nano100 Series培训资料:Nano100 PWM/Capture
  • jetson nano

    2020-11-20 21:08:11
    Trying to run openpnp on jetson nano gives me error: <code>Caused by: java.lang.UnsupportedOperationException: Architecture "aarch64" is not supported. Does it mean that there is no way to run...
  • nano-rs:使用Tokio在Rust中实现Nano
  • [nano] Added nano editor

    2020-12-09 06:29:53
    <div><p>Nano > Vim. <p>Signed-off-by: Graham Weldon </p><p>该提问来源于开源项目:habitat-sh/core-plans</p></div>
  • NuMicro Nano100 Series培训资料:Nano100 Tool Installation and Practice
  • arduino nano

    2015-08-09 17:32:39
    描述Arduino Nano的电子文档,原理图和pcb图
  • NANO8F_NANO9F_主板手册

    2018-01-29 17:16:37
    NANO8F_NANO9F_主板手册。适用于J1900CPU的无风扇主板。
  • Jetson Nano学习汇总

    2020-12-21 10:56:18
    Jetson Nano系列学习汇总 Jetson Nano 【1】入手开箱、烧系统 Jetson Nano 【2】组装,基本入门配置 Jetson Nano 【3】安装并检查基本环境 Jetson Nano 【4】安装Pytorch1.4 Jetson Nano 【5】Pytorch-YOLOv3原生...
  • AMC-NANO_固件 AMC-NANO的固件更新 AMC-NANO的固件过程视频: (简短版) (完整版) 您可以使用AMC配置工具来访问和修改AMC-NANO中的参数: ======= enc_4dof_AMC-NANO_v2_11 fix4 ======= release date: 03/...
  • Nano是一种数字支付协议,旨在实现可访问且轻巧,重点在于消除其他加密货币中存在的低效率问题。 通过超快速的交易和安全,绿色,分散式网络上的零费用,这使Nano成为日常交易的理想选择。 指南与文件 其他文档详细...
  • nano教程

    2019-06-12 15:45:22
    使用Linux VPS会经常和编辑器打交道,一般常用的是vi和nano,虽然vi功能强大,但是相对新手来要稍微难上手,GNU nano是一个体积小巧而功能强大的文本编辑器。这里就简单说一下nano的使用方法。 安装 CentOS:执行...

    使用Linux VPS会经常和编辑器打交道,一般常用的是vinano,虽然vi功能强大,但是相对新手来要稍微难上手,GNU nano是一个体积小巧而功能强大的文本编辑器。这里就简单说一下nano的使用方法

    安装

    CentOS:执行yum -y install nano

    Debian:执行apt-get install -y nano

    新建/打开文件

    nano 路径+文件名

    如果改文件存在,上面的命令将打开这个文件;如果文件不存在则将会创建一个新文件并打开。

    Note:在Windows系统中,一个文件应当有后缀名,比如.txt,以供系统进行类型判断,不过Linux并不根据 后缀名来判断类型。当然,写上后缀名也无妨,比如example也可以用example.txt。

    光标控制

    移动光标:使用用方向键移动。

    选择文字:按住鼠标左键拖到。

    复制、剪贴和粘贴

    复制一整行:Alt+6

    剪贴一整行:Ctrl+K

    粘贴:Ctrl+U

    如果需要复制/剪贴多行或者一行中的一部分,先将光标移动到需要复制/剪贴的文本的开头,按Ctrl+6(或者Alt+A)做标记,然后移动光标到 待复制/剪贴的文本末尾。这时选定的文本会反白,用Alt+6来复制,Ctrl+K来剪贴。若在选择文本过程中要取消,只需要再按一次Ctrl+6。

    搜索

    按Ctrl+W,然后输入你要搜索的关键字,回车确定。这将会定位到第一个匹配的文本,接着可以用Alt+W来定位到下一个匹配的文本。

    翻页

    用Ctrl+Y到上一页,Ctrl+V到下一页

    保存

    使用Ctrl+O来保存所做的修改

    退出

    按Ctrl+X

    如果你修改了文件,下面会询问你是否需要保存修改。输入Y确认保存,输入N不保存,按Ctrl+C取消返回。

    如果输入了Y,下一步会让你输入想要保存的文件名。如果不需要修改文件名直接回车就行;若想要保存成别的名字(也就是另存为)则输入新名称然后确 定。这个时候也可用Ctrl+C来取消返回。

    获得帮助

    进入nano界面后,下面有两行菜单,例如,“^G Get Help”。其意义如下:

    ^G意味着快捷键是Ctrl+G,“Get Help”当然是功能了。

    根据这些提示就可以立刻开始使用nano了,也可以Ctrl+G看看帮助。

    Note:nano中,黑底白字表示快捷键操作。其中“^”表示Ctrl键,则Ctrl+G就表示成“^G”。“M”表示 Alt键,则Alt+W表示为“M-W”。

    转自:

    https://www.vpser.net/manage/nano.html

    展开全文
  • 生成带有您选择的前缀的NANO地址。 前缀越长,计算所需的时间就越长。 安装 首先,设置Rust。 最好的方法是使用 。 要从crates.io安装nano-vanity : cargo install nano-vanity 要从源代码安装nano-vanity : ...
  • nano使用

    2021-04-08 16:00:49
    nano 编辑一个文件: 1. nano 1 输入 内容,比如 123 编辑内容 2. 修改内容后,退出 ctrl + X == Exit 3.是否保存 Y 4. 输入文件名字,或者保存不变。 5. 输入 Enter。结束。 说明:...
  • 在root下安装 yum install nano ...下载软件 sudo yum install -y nano 下载安装nano卸载软件 sudo yum remove -y nano仅下载sudo yum install --downloadonly --downloaddir=.nano本地安装sudo yum locali...
  • Arduino Nano 引脚分配图及定义详解

    万次阅读 多人点赞 2019-07-10 13:53:51
    Arduino Nano 是一款基于 Microchip ATmega 328P 8位微控制芯片的智能硬件开发板,尺寸小巧功能强悍。 双排针引出,可以方便栈接在面包板上,可以灵活地通过杜邦端子跟其它模块相连,可以恰到好处地藏身于各种...
  • nano_pk 集成了Hargassner Nano-PK颗粒加热系统的家庭助理。 这是一个定制组件,用于将带有Touch Tronic(触摸屏控件)的Hargassner暖气集成到Home Assistant中。 它将向您的HA添加许多新传感器,以显示加热的当前...
  • 纳米气泡-NANO网络交易可视化工具 可用@ 在本地运行 安装 克隆回购 运行npm i && npm start
  • 该项目实现了一个利用Mbed OS的Arduino库,并使Nano 33 BLE Sense入门变得简单!
  • nano如何撤销 nano为什么没有撤销新版nano默认开启撤销旧版nano如何开启撤销方法一方法二参考文章 新版nano默认开启撤销 从2014年7月开始的nano version 2.3.5,撤销/重做成为标准: Alt-U 或 Option-U – 撤消 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,681
精华内容 7,872
关键字:

nano