【开源】基于迪文屏的智能眼方案
该方案是基于迪文屏设计的模拟人眼跟随运动的智能眼例程。工程师使用几张人眼图片素材,实现了眼珠运动、眨眼、人脸识别和跟随等功能。
一、介绍
其实这个智能眼在做雷达设计的时候已经在着手了,但是由于素材紧缺,关于眼睛的素材网上比较少,只能自己去P,也是现学现卖,做出来的效果还是可以的,也加入了AI(人脸识别)的元素。
二、设计
首先是素材,我先晒一下素材,因为这次设计素材花的时间也比较多,比如眨眼的动画,以及眼球+眼白的血丝,这里分享给大家,大家在后面的开源文件自取。 之后就是页面的设计,页面设计还是比较简单的,因为就是两张图形控件,如下图所示。 首先要设计眨眼,眨眼的话,就是隔一段时间让眼皮的图片轮流显示一下,这里我是这么进行设计的。 - //眨眼动画
- void blink_animat(void)
- {
- if(blink_flag == 0)
- {
- blink_cnt++;
- if(blink_cnt >= 4)
- {
- blink_flag = 1;
- }
- }
- else
- {
- blink_cnt--;
- if(blink_cnt <= 0)
- {
- blink_flag = 0;
- }
- }
-
- write_dgus_vp(0x3000, (u8 *)&blink_cnt, 2);
- }
- void blink_run()
- {
- static u32 run_timer_cnt = 0;
- run_timer_cnt++;
- if(run_timer_cnt >= 2000000)
- {
- run_timer_cnt = 0;
- blink_animat();
- Delay_ms(30);
- blink_animat();
- Delay_ms(30);
- blink_animat();
- Delay_ms(30);
- blink_animat();
- Delay_ms(30);
- blink_animat();
- Delay_ms(30);
- blink_animat();
- Delay_ms(30);
- blink_animat();
- Delay_ms(30);
- blink_animat();
- Delay_ms(30);
- }
- }
复制代码眨眼动画看起来还是很简单的,接下来就是眼珠自然左右看,这里设计和眨眼类似,但是需要比较晶振的控制眼球运动的时间,这里经过多次调试,我设计出了下面这套代码。 这样其实就完成了一个Demo,但是我觉得还是不够的,因为眼睛光自己动怎么行,所以我就加入的ESP32去识别人脸,然后眼珠跟着人脸进行运动,需要做的处理就是,检测到人脸的时候,眼睛就不能自己运动了,这里我就定义了一个变量在while循环中自增,当自增到一定数值时,眼珠就自己运动,当串口收到数据时,这个变量就清理,然后只根据人脸的位置进行眼睛的移动。主要代码如下。 - if(rec_data_timer_cnt < 1000000)
- {
- rec_data_timer_cnt++;
- }
- else
- {
- eyeball_run();
- }
复制代码- extern u32 rec_data_timer_cnt;
- extern u16 eyeball_timer_cnt;
- void Communication_CMD(u8 st)
- {
- if((uart[st].Rx_F==1 )&&(uart[st].Rx_T==0))
- {
- rec_data_timer_cnt = 0;
- eyeball_timer_cnt = 0;
- #if(Type_Communication==1)
- Describe_8283(st);
- #elif(Type_Communication==2)
- Describe_Modbus(st);
- #endif
- uart[st].Rx_F=0;
- uart[st].Rx_Num=0;
- }
- }
复制代码然后我还设计了3D外壳,让整个Demo更好看,整体效果如下图所示。
三、总结 |