本次為大家推薦的迪文開發者論壇開源項目是一個很有意思的模擬人眼跟隨運動的例程。工程師使用幾張人眼圖片素材,實現了眼珠運動、眨眼、人臉識別和跟隨等功能,讓我們一睹為快:
01
方案簡介
1. UI圖片素材
編者注:迪文智能屏是基于圖片來完成UI開發的,可以便捷的實現各類顯示效果。
2.界面開發
通過DGUS軟件開發界面比較簡單,只需要兩個圖形控件即可。在該例程中,工程師選擇了一款2.1寸圓形智能屏。
3.實現眨眼
隔一段時間讓眼皮的圖片輪流顯示一下://眨眼動畫
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()
{
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);
}
}
4.實現眼珠自然左右看
這里和眨眼類似,但是需要比較晶振的控制眼球運動的時間,這里經過多次調試,工程師設計出了下面這套代碼。//眼珠動畫
void eyeball_animat(void)
{
eyeball_timer_cnt++;
if(eyeball_timer_cnt < 50)
{
eyeball_cnt = 20;
}
else if(eyeball_timer_cnt < 51)
{
eyeball_cnt = 50;
}
else if(eyeball_timer_cnt < 52)
{
eyeball_cnt = 80;
}
else if(eyeball_timer_cnt < 53)
{
eyeball_cnt = 94;
}
else if(eyeball_timer_cnt < 103)
{
eyeball_cnt = 94;
}
else if(eyeball_timer_cnt < 104)
{
eyeball_cnt = 80;
}
else if(eyeball_timer_cnt < 105)
{
eyeball_cnt = 50;
}
else if(eyeball_timer_cnt < 106)
{
eyeball_cnt = 20;
}
else if(eyeball_timer_cnt < 107)
{
eyeball_cnt = -10;
}
else if(eyeball_timer_cnt < 108)
{
eyeball_cnt = -40;
}
else if(eyeball_timer_cnt < 158)
{
eyeball_cnt = -54;
}
else if(eyeball_timer_cnt < 159)
{
eyeball_cnt = -40;
}
else if(eyeball_timer_cnt < 160)
{
eyeball_cnt = -10;
}
else if(eyeball_timer_cnt < 161)
{
eyeball_cnt = 20;
eyeball_timer_cnt = 0;
}
//左右移動
// if(eyeball_flag == 0)
// {
// eyeball_cnt++;
// if(eyeball_cnt >= 94)
// {
// eyeball_flag = 1;
// }
// }
// else
// {
// eyeball_cnt--;
// if(eyeball_cnt <= -54)
// {
// eyeball_flag = 0;
// }
// }
if(eyeball_cnt >= 0)
{
eyeball_pos[0] = 0x00;
eyeball_pos[1] = eyeball_cnt;
}
else
{
eyeball_pos[0] = 0xFF;
eyeball_pos[1] = (eyeball_cnt & 0xFF);
}
write_dgus_vp(0x3111, (u8 *)&eyeball_pos, 2);
}
void eyeball_run()
{
static u32 run_timer_cnt = 0;
run_timer_cnt++;
if(run_timer_cnt >= 20000)
{
run_timer_cnt = 0;
eyeball_animat();
}
}
5.加入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;
}
}
-
人臉識別
+關注
關注
76文章
4014瀏覽量
82083 -
迪文屏
+關注
關注
3文章
78瀏覽量
5429
發布評論請先 登錄
相關推薦
評論