一、背景介绍
傩舞,又称为鬼戏,是华夏民族最古老的一种祭神跳鬼的活动。身处西北民间傩舞与四川、云贵的傩文化相似,但也有自己的特点。尤其是傩舞的面具(或叫面子),各庙宇都不尽相同,我们使用二哈识图2制作民俗博物馆中傩舞面具的介绍以及游戏互动,让傩舞面具就在我们身边,让它活起来。



我们使用以下面具(已备注名称):

二、项目设计
1.核心功能
本项目的功能有两个,一是展示傩舞的面具,并介绍面具的特点。二是通过使用二哈识图2互动,加深对脸谱人物的理解。
2.项目流程图
本项目分为两个内容分别用两个子函数实现,展示模式:展示傩舞面具及面具特点;游戏模式:小游戏互动,让用户找出任务面具。
2.1展示模式流程:

2.2游戏模式流程图

3.器材清单
4.编程软件:mind+ v2

5.电路接线:

三、实现步骤与源码
1.制作图片简介并放入sd中
如果使用图片+文字的方式,会出现背景白色,影响图片效果。更重要的是屏幕显得比较乱。我的操作是使用PS处理下载的面具图片,剪切参数选择匹配行空板K10的屏幕尺寸,并提前测试处理过的图片是否能够正常显示,行空板K10一般显示.PNG文件,且对文件大小又一定要求。

2.使用二哈识图2识别面具照片并学习(人脸识别)
2.1.选择人脸识别功能
给HUSKYLENS 2供电,启动成功后,找到“人脸识别”功能。

将HUSKYLENS 2对着有人脸的画面,检测到人脸时,屏幕上会用白色方框,框
出该人脸,并用白色圆点标记出眼睛、鼻子、嘴角的位置。如果画面中出现多个人脸,将会出现多个方框。

接着我们学习人脸,并标注名称。
对准要学习的某个人脸,人脸被白框框住后,调整HUSKYLENS 2“看”的角度,使屏幕中间的“十”字位于白色框内,然后按下HUSKYLENS 2右上角A键,学习该人脸。
学习完成后,如识别到已学习的人脸,屏幕将以彩色方框框出人脸,并在人脸上方显示人名、ID号及置信度,例如“人脸:ID1 97%”。
设置人脸名称:
点击人脸识别下的“设置名字”,上下滑动左上角的数字,选择为哪个ID设置名字;点击屏幕上的键盘可设置名字,设置完毕需点击右下角√键保存,保存成功则右上角会显示绿色对勾标志。名字中英文均可。

3.使用mind+编写程序

主程序开始:显示背景界面,并且叙述甘肃傩舞文化。每一句显示间隔5秒,足够参观者读完描述。在博物馆内,使用静音播放模式,无须嘈杂的声音。

提示用户使用行空板的A和B键控制行空板进入展示(学习)模式或者游戏模式。

使用A,B键触发展示模式和游戏模式。

以上是展示模式的程序,比较简单,按顺序将TF卡中的图片依次播放处理,图片中又面具的介绍,等待3秒足够参观者读完。

游戏模式的中首先给用户一个任务,如请拍一下吕布的面具(脸谱),参观者手持二哈识图2拍摄认为是吕布的面具,行空板K10给予反馈,如果拍对了,绿色字体的提示,恭喜你拍对了。
如果拍错了,除了错误提示之外游戏继续进行,直到拍对了任务面具。
其中判断的程序每次需要调用,我写了一个函数来实现。函数如下:

/*!
* MindPlus
* DFRobot, 行空板 K10
*/
#include "asr.h"
#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 动态变量
volatile float mind_n_SuiJiShu, mind_n_TuiChuBiaoZhi, mind_n_RenLianID;
// 创建对象
UNIHIKER_K10 k10;
uint8_t screen_dir=2;
HuskylensV2 huskylens;
ASR asr;
void DF_YouXiMoShi();
void DF_ZhanShiMoShi();
void DF_ShiBieXianShi(float mind_n_int);
void onButtonAUnPressed();
void onButtonBUnPressed();
// 主程序开始
void setup() {
k10.begin();
k10.initScreen(screen_dir);
k10.creatCanvas();
k10.initSDFile();
k10.buttonA->setUnPressedCallback(onButtonAUnPressed);
k10.buttonB->setUnPressedCallback(onButtonBUnPressed);
Wire.begin();
while (!huskylens.begin(Wire)) {
delay(100);
}
asr.setAsrSpeed(2);
huskylens.switchAlgorithm(ALGORITHM_FACE_RECOGNITION);
Serial.begin(9600);
k10.canvas->canvasDrawImage(0, 0, "S:/faces/index2.png");
k10.canvas->updateCanvas();
delay(3000);
k10.canvas->canvasText("甘肃傩舞是流传于甘肃省多种传统舞蹈形式的统称,具有悠久历史和", 0, 248, 0x0000FF, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
asr.speak("甘肃傩舞是流传于甘肃省多种传统舞蹈形式的统称,具有悠久历史和深厚文化积淀,主要以驱邪祈福、祭祀酬神为核心功能。 其中,最具代表性的项目包括永靖傩舞、文县池哥昼和临洮傩舞,均被列入国家级或省级非物质文化遗产名录。均被列入国家级或省级非物质文化遗产名录。");
delay(5000);
k10.canvas->canvasText("深厚文化积淀,主要以驱邪祈福、祭祀酬神为核心功能。", 0, 248, 0x0000FF, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
delay(5000);
k10.canvas->canvasText(" 其中,最具代表性的项目包括永靖傩舞、文县池哥昼和临洮傩舞,均被列入国家级或省级非物质文化遗产名录。", 0, 248, 0x0000FF, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
delay(5000);
k10.canvas->canvasText("均被列入国家级或省级非物质文化遗产名录。", 0, 248, 0x0000FF, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
delay(5000);
k10.canvas->canvasText("A键进入学习模式,B键进入游戏模式", 0, 248, 0x0000FF, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
}
void loop() {
}
// 自定义函数
void DF_YouXiMoShi() {
k10.canvas->canvasClear();
k10.canvas->canvasDrawImage(0, 0, "S:/faces/index2.png");
k10.canvas->updateCanvas();
delay(3000);
mind_n_SuiJiShu = (random(1, 4+1));
Serial.println((String("随机变量:") + String(mind_n_SuiJiShu)));
if ((mind_n_SuiJiShu==1)) {
k10.canvas->canvasText("请拍一下曹操的脸谱。", 0, 248, 0xFF0000, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
DF_ShiBieXianShi(1);
}
else if ((mind_n_SuiJiShu==2)) {
k10.canvas->canvasText("请拍一下关羽的脸谱。", 0, 248, 0xFF0000, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
DF_ShiBieXianShi(2);
}
else if ((mind_n_SuiJiShu==3)) {
k10.canvas->canvasText("请拍一下刘备的脸谱。", RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, ID), 248, 0xFF0000, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
DF_ShiBieXianShi(3);
}
else if ((mind_n_SuiJiShu==5)) {
k10.canvas->canvasText("请拍一下二郎神的脸谱。", 0, 248, 0xFF0000, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
DF_ShiBieXianShi(5);
}
else if ((mind_n_SuiJiShu==6)) {
k10.canvas->canvasText("请拍一下二郎神的脸谱。", 0, 248, 0xFF0000, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
DF_ShiBieXianShi(6);
}
else if ((mind_n_SuiJiShu==4)) {
k10.canvas->canvasText("请拍一下吕布的脸谱。", 0, 248, 0xFF0000, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
DF_ShiBieXianShi(7);
}
}
void DF_ZhanShiMoShi() {
k10.canvas->canvasDrawImage(0, 0, "S:/faces/zhangfei.png");
k10.canvas->updateCanvas();
delay(3000);
k10.canvas->canvasDrawImage(0, 0, "S:/faces/liubei.png");
k10.canvas->updateCanvas();
delay(3000);
k10.canvas->canvasDrawImage(0, mind_n_SuiJiShu, "S:/faces/guanyu.png");
k10.canvas->updateCanvas();
delay(3000);
k10.canvas->canvasDrawImage(0, 0, "S:/faces/guanyu.png");
k10.canvas->updateCanvas();
delay(3000);
k10.canvas->canvasDrawImage(0, 0, "S:/faces/lvbu.png");
k10.canvas->updateCanvas();
delay(3000);
k10.canvas->canvasDrawImage(0, 0, "S:/faces/caocao.png");
k10.canvas->updateCanvas();
delay(3000);
k10.canvas->canvasDrawImage(0, mind_n_SuiJiShu, "S:/faces/sanyanerlang.png");
k10.canvas->updateCanvas();
delay(3000);
}
void DF_ShiBieXianShi(float mind_n_int) {
mind_n_TuiChuBiaoZhi = 0;
while (!(mind_n_TuiChuBiaoZhi==1)) {
huskylens.getResult(ALGORITHM_FACE_RECOGNITION);
if (huskylens.available(ALGORITHM_FACE_RECOGNITION)) {
mind_n_RenLianID = RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, ID);
Serial.println((String("识别的人脸:") + String(mind_n_RenLianID)));
if ((mind_n_RenLianID==mind_n_int)) {
k10.canvas->canvasText("拍对了,恭喜恭喜。", 0, 272, 0x00FF00, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
delay(3000);
mind_n_TuiChuBiaoZhi = 1;
}
else {
k10.canvas->canvasText("你拍错了,再接再厉。", 0, 272, 0xFF0000, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
}
}
}
delay(5000);
k10.canvas->canvasText("A键进入学习模式,B键进入游戏模式", 0, 248, 0x0000FF, k10.canvas->eCNAndENFont24, 10, true);
k10.canvas->updateCanvas();
}
// 事件回调函数
void onButtonAUnPressed() {
DF_ZhanShiMoShi();
}
void onButtonBUnPressed() {
DF_YouXiMoShi();
}
四、成果展示与演示
部分界面展示
序言篇动图
![fce26d2bfae9bdfd43cd415bd253dbe1[00_00_01--00_00_21].gif](https://makelogimg.dfrobot.com.cn/makelog/633eedb9f6f6eea679b37bc2/7a4e9ab97dc212e53d93c715d6904460.gif)
展示面具(脸谱)篇
![1eafb4d7cfc119143011a931c21f8293[00_00_06--00_00_26].gif](https://makelogimg.dfrobot.com.cn/makelog/633eedb9f6f6eea679b37bc2/3444be7b1c20654ee24fc44c95178e6e.gif)
游戏篇
![48d16ff16edea72be1f7fd1b500c150c[00_00_01--00_00_21].gif](https://makelogimg.dfrobot.com.cn/makelog/633eedb9f6f6eea679b37bc2/7ba281cc9b4b01eee7fa5f97f53df541.gif)
展示图片如下:






五、项目结语
本项目旨在使用行空板K10和二哈识图2完成博物馆内傩舞民俗的传承,从傩舞面具(脸谱)这个小角度出发,让观展者了解傩舞,了解傩舞脸谱。本项目还需要进一步的迭代升级,如傩舞者动作的识别以及传承傩舞动作的角度,让傩舞民俗生生不息。

返回首页
回到顶部










评论