登録した顔画像のマッチング結果をシリアルでM5stackに送信して、確かさがある一定以上ならばブザーで知らせるという簡単なアプリです。
https://isehara-3lv.sakura.ne.jp/blog/2022/05/24/unitv2-aiカメラとm5stackをgroveコネクタで接続して認識結果を/
のアップデートの形になります。
<シリアルのデータ形式>
顔認証でシリアルから流れるデータは、
{“num”:1,”face”:[{“x”:92.80541992,”y”:0,”w”:366.1600952,”h”:478,”prob”:0.995221317,”match_prob”:0.659739733,”name”:”face_1″,”mark”:[{“x”:194,”y”:178},{“x”:358,”y”:158},{“x”:292,”y”:246},{“x”:228,”y”:356},{“x”:368,”y”:338}]}],”running”:”Face Recognition”}
こんな感じで、JSONで階層構造と配列を使っています。マッチング閾値(match_prob)へのアクセスは["face"][0]["match_prob"]となります。
#include <M5Stack.h>
#include <arduinojson.h>
#include <softwareserial.h>
SoftwareSerial Grove(22, 21); // define rx/tx connecting to the UnitV2 camera
// SoftwareSerial(rxPin, txPin, inverse_logic)
float x;
int y;
long k;
char data[1000];
void setup() {
M5.begin();
M5.Lcd.setCursor(20, 40);
M5.Lcd.setTextSize(2);
M5.Speaker.begin();
Serial.begin(115200);
Grove.begin(115200);
M5.Lcd.print("--initialized--"); // display M5 Lcd message
M5.Lcd.setCursor(20, 70);
M5.Lcd.print("Face recongition");
}
void loop_(){
if(Grove.available()) {
String recvStr = Grove.readStringUntil('\n');
if(recvStr[0] == '{'){
Serial.print(recvStr);
}
}
}
void readJSON(void){
String recvStr = Grove.readStringUntil('\n');
StaticJsonDocument<1024> doc;
DeserializationError error = deserializeJson(doc, recvStr);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
x = doc["face"][0]["match_prob"];
}
void loop(){
M5.Speaker.mute();
if(Grove.available()) {
readJSON();
Serial.println(x);
if (x > 0.7f)
{
M5.Speaker.setVolume(3);
M5.Speaker.beep();
delay(200);
}
}
}
データのバイト数が結構大きく(800バイト以上)なるので、char data[1000]とStaticJsonDocument<1024>を大きめのサイズにしています。これをしないとM5stackがリブート繰り返しました。
ドキュメント(以下のリンク)によれば、StaticJsonDocumentは1KB以下の小さめのJSONファイルで使えとあります。それほど多くないスタックエリアを使うので、StaticJsonDocumentでの設定値が小さくてスタックオーバーフローを起こしたと思われ、M5stackがリブートを繰り返してました。
https://arduinojson.org/v6/api/staticjsondocument/
認識の閾値は流れるデータからmatch_probを0.7以上で判断しています。
M5.Speaker.tone()は動作しなかったのでbeepを使って音出ししています。
P.S. @2022/6/16
細かな体裁(UnitV2のAP立ち上がり検知、認識結果の顔IDプリントアウト)を整えました。ソースはこちらに、
https://github.com/chateight/UnitV2_camera/tree/master/src
admin