步骤1 设计灵感:
在第一轮的比赛中,虽然使用了《旗语-基于区位码的汉字加密系统》作为标题,但实际上和旗语没有关系。主要是区位码和手势识别的功劳。
所以在第二轮的比赛中,准备加入真实的旗语系统。
旗语(英语:Flag semaphore),一种利用手旗或旗帜传递信号的沟通方式,可分单旗和双旗等两种,又称为“手旗信号”或“手旗通信”,距离较长时,借助双筒望远镜或望远镜,以延伸目视距离。国际通用一些旗帜表示如下图:
虽然Mind+提供的图像识别功能中没有确切的旗帜识别接口,但我们可以利用其提供的人体关键点识别接口来进行信号的识别。为了表示不同的旗帜位置,我们可以使用,肩部到手腕的连线和垂直平面的夹角来表示旗帜的不同位置,如下图所示:
利用肩部和腕部的数据点位置,就可以获得左右手的位置关系的。当然为了能正确识别,对于角度的关系处理还需要处理阈值,下面讲解代码的时候会说到。
当然对于中国来说,能使用中文当然是最好的。因此为了简化内容,此文还是准备利用四位数区位码进行汉字的传递。
步骤2 软件部分设计1:
人体关键点的识别在电脑上用Mind+网络服务模块里的AI图像识别功能实现。实际上,如果我们仔细看第二轮的要求会发现,只要能使用Mind+和DF的硬件就可以了,百度的语音识别等其他有趣的AI功能可以自写代码实现:比如脱离PC机在树莓派或者虚谷号上完成代码编写。
但鉴于时间关系,此文就不在树莓派上折腾了。
代码逻辑如下图所示:
因为要用到语音播报,所以需要选中“功能模块”下的“文字朗读”功能,和“网络服务”下的“MQTT”和“AI 图像识别”两个模块。
另外还需要使用百度智能云应用:
虽然Mind+ 内置了一个公用账户,但是公用账户有同时访问限制,因此最好还是使用自己注册的账户。首先登录百度 AI 开放平台,https://ai.baidu.com,点击页面右上角“控制台”,然后“登录”自己的百度账号。成功后进入控制台页面,点击左边栏“人脸识别”。
创建好以后会有 AppID、API Key、Secret Key 三个信息,记录下来,后续编程会用到。
做好以上准备后,我们通过上面的角度获取公式,然后利用百度人体关键点识别接口 ,通过:“函数识别旗语”,获取不同旗帜所表示的字符。四个字符识别完成后,利用一个确认旗帜,完成一个汉字的传输。
上图中的 “函数画图”主要是画出识别的大致形状,好进行判断。
当然这里为了模拟,旗语的识别过程。利用 MQTT协议发送到 掌控板使用的接收端。
最后,在标准的国际手旗信号中: 开始通信时,发信船将字母旗“J”,悬于旗绳顶端,收信船看到后也挂字母旗“J”,表示已准备妥当后,即开始手旗通信。对于收发信文、更正符号、结束通信皆有一定的作业程序(SOP)
笔者为了模拟这个操作,由接收方控制什么时候进行信息传输,还是使用了MQTT协议,进行通讯。不过为了和正常的信息传输通道区分,换了一个TOPIC:
在 Mind+ 角色中编写主程序。首先设置百度智能云和 MQTT 的初始化参数。将前面创建百度智能云应用获得的 AppID、API Key、Secret Key 都填入空白处。MQTT 使用 SIoT,SIoT下载地址:http://mindplus.dfrobot.com.cn/siot。运行 SIoT程序后将服务器地址等填入空白处。
步骤3 软件设计部分2:
接收方用掌控板来进行处理,经由MQTT的Topic0通讯进行信息的传输。当然可以直接进行旗语的数字信息传输,不经区位码编码。在接收端进行再进行编码会更和实际接近点。但因为 mind+在PC的实时模式和方便调试,所以就在本地直接编码了。但道理是一样,这里就偷个懒。
步骤4 硬件使用:
因为疫情的原因,在家也没有什么材料,这里就用几个简单的东西摆弄下。当然这里要感谢女儿的积极配合与妻子的倾情合作(这个成品是妻子制作的...)
我们称之为:《信息接收平台电视机》。
最后:因为视频录制的不方便。旗语识别发送端,和掌控板接收端是分开录制,敬请见谅。
视频的背景音是本人预先录制在mind+里的,每次识别成功都自动读出来。(当时也是为了测试是否识别成功。)
视频里识别的旗语手势是:4668(武),2626(汉),2851(加),5145(油)。
云天2020.02.26
有创意,赞