回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

二哈识图2助力民俗博物馆傩舞面具(脸谱)活起来 简单

头像 _深蓝_ 2025.12.15 32 0

一、背景介绍

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

傩舞03.png
图片.png
图片.png

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

图片.png

 

二、项目设计

1.核心功能

本项目的功能有两个,一是展示傩舞的面具,并介绍面具的特点。二是通过使用二哈识图2互动,加深对脸谱人物的理解。

 

2.项目流程图

本项目分为两个内容分别用两个子函数实现,展示模式:展示傩舞面具及面具特点;游戏模式:小游戏互动,让用户找出任务面具。

2.1展示模式流程:

图片.png

2.2游戏模式流程图

图片.png

3.器材清单

 

 

 

 

 

 

 

 

材料清单

4.编程软件:mind+ v2

https://img.dfrobot.com.cn//6099f2d3bddfc41c3293cd27/faa0b1cb4b11af76e37fea84a42cbadc.png?imageView2/0/format/webp

 

5.电路接线:

Interface Diagram

三、实现步骤与源码

1.制作图片简介并放入sd中

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

图片.png

2.使用二哈识图2识别面具照片并学习(人脸识别)

2.1.选择人脸识别功能

给HUSKYLENS 2供电,启动成功后,找到“人脸识别”功能。

Interface Diagram

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

Interface Diagram

接着我们学习人脸,并标注名称。

对准要学习的某个人脸,人脸被白框框住后,调整HUSKYLENS 2“看”的角度,使屏幕中间的“十”字位于白色框内,然后按下HUSKYLENS 2右上角A键,学习该人脸。

学习完成后,如识别到已学习的人脸,屏幕将以彩色方框框出人脸,并在人脸上方显示人名、ID号及置信度,例如“人脸:ID1 97%”。

设置人脸名称:

点击人脸识别下的“设置名字”,上下滑动左上角的数字,选择为哪个ID设置名字;点击屏幕上的键盘可设置名字,设置完毕需点击右下角√键保存,保存成功则右上角会显示绿色对勾标志。名字中英文均可。

Interface Diagram

 

3.使用mind+编写程序

图片.png

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

 

图片.png

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

图片.png

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

 

图片.png

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

 

图片.png

游戏模式的中首先给用户一个任务,如请拍一下吕布的面具(脸谱),参观者手持二哈识图2拍摄认为是吕布的面具,行空板K10给予反馈,如果拍对了,绿色字体的提示,恭喜你拍对了。

如果拍错了,除了错误提示之外游戏继续进行,直到拍对了任务面具。

其中判断的程序每次需要调用,我写了一个函数来实现。函数如下:

图片.png

 

代码
/*!
 * 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();
}

四、成果展示与演示

部分界面展示
d92cb7feb31f5b8aa4a9109a5f859050.jpg

序言篇动图

fce26d2bfae9bdfd43cd415bd253dbe1[00_00_01--00_00_21].gif

展示面具(脸谱)篇

1eafb4d7cfc119143011a931c21f8293[00_00_06--00_00_26].gif

游戏篇

48d16ff16edea72be1f7fd1b500c150c[00_00_01--00_00_21].gif


 

 

展示图片如下:

caocao.png
guanyu.png
liubei.png
lvbu.png
sanyanerlang.png
zhangfei.png

五、项目结语

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

评论

user-avatar