顔追跡カメラ
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 15 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 1 |
必要なツールとマシン
> |
| |||
| ||||
| ||||
| ||||
| ||||
|
アプリとオンラインサービス
> |
|
このプロジェクトについて
数か月前、私は同僚の頭の1つをモデル化して印刷しました。冗談を言って、この頭のメカニズムを構築して、人を検出し、部屋の中を動き回るときに見つめ続けるのは面白いと思いました。
3Dプリントに合うようにメカニズムを小さくするのに苦労したので、プロジェクトを食器棚に永久に固定して忘れるのではなく、誰もが楽しめる使いやすいソフトウェアを使用して、組み立てが簡単なモデルを作成することにしました。 。
<図>............... https://www.littlefrenchkev.com/face-tracking-camera-mini .................
<図>
どのように機能しますか?
カメラは、ArduinoUnoによって駆動される2つのサーボを使用して移動します。カメラはコンピューターに接続されており、ソフトウェアがカメラから受信した画像から顔を見つけようとします。
顔が見つかった場合、ソフトウェアはArduinoにメッセージを送信して、検出された顔を画像の中央に配置するためにカメラを動かします。
顔が見つからない場合、ソフトウェアはArduinoにメッセージを送信してランダムな位置に移動させます。
次のようなオプションを使用して、ソフトウェアを非常に柔軟にしようとしました。
- 変更可能なサーボ範囲
- サーボの回転を反転させる可能性
- 手動制御
これにより、他の目的で簡単に再利用できるようになることを願っています。
また、検出の状態を示す3つのLEDを追加しました。赤は検出されない場合、黄色は顔が検出されたが画像の中央にない場合、緑は顔が検出されて画像の中央にある場合です。
LED自体はそれほど興味深いものではありませんが、いくつかのライトをオン/オフするだけでなく、デバイスを簡単に変更して便利なアクションを実行できるようにする必要があります。
Arduinoとソフトウェア間の通信は、シリアル通信(USB経由)を介して行われます。
顔検出ソフトウェアはPythonで書かれています。コードを確認したい場合(警告:おそらく素晴らしいことではありません。自分で学習しています)、または自分のプロジェクトで再利用したい場合に備えて、すべてのPythonファイルをGitHubに残しました。
Pythonがお気に召さない場合は、私のWebサイトから実行可能バージョンをダウンロードすることもできます。
自分で作りたい場合は、以下の動画をチェックしてください。できるだけわかりやすくするように心がけましたが、うまくいったといいのですが。
必要なものすべて
組み立て
配線
ソフトウェアとセットアップ
コード
- Arduinoコード
Arduinoコード C / C ++
これは、arduinoにアップロードされるコードです// arduinoフォーラムでRobin2が行った作業に基づいてスケッチ//詳細はこちら//https://forum.arduino.cc/index.php?topic =225329.msg1810764#msg1810764#includeServo panServo; Servo tileServo; byte redledPin =2; byte yellowledPin =3; byte greenledPin =4; const byte buffSize =40; char inputBuffer [buffSize]; const char startMarker ='<'; const char endMarker ='>'; byte bytesRecvd =0; boolean readInProgress =false; boolean newDataFromPC =false; float panServoAngle =90.0; float tileServoAngle =90.0; int LED_state =0; // 8 =============Dvoid setup(){Serial.begin(115200); panServo.attach(8); tileServo.attach(9); pinMode(redledPin、OUTPUT); pinMode(yellowledPin、OUTPUT); pinMode(greenledPin、OUTPUT); // moveServo(); start_sequence(); delay(200); Serial.println( " "); //メッセージをコンピューターに送信します} // 8 =============Dvoid loop(){getDataFromPC(); replyToPC(); moveServo(); setLED();} // 8 =============Dvoid getDataFromPC(){// PCからデータを受信し、inputBufferに保存if(Serial.available()> 0){char x =Serial.read(); //シリアルからcharを読み取りますif(x ==endMarker){//終了マーカーを探しますreadInProgress =false; //見つかった場合は、進行中の読み取りをtrueに設定します(バッファへの新しいバイトの追加を停止します)newDataFromPC =true; //新しいデータが利用可能であることをarduinoに知らせますinputBuffer [bytesRecvd] =0; //入力バッファをクリアしますprocessData(); //バッファ内のデータを処理します} if(readInProgress){inputBuffer [bytesRecvd] =x; //入力バッファにバイトを入力bytesRecvd ++; //インデックスをインクリメントif(bytesRecvd ==buffSize){//バッファがいっぱいの場合bytesRecvd =buffSize-1; //終了マーカー用のスペースを保持します}} if(x ==startMarker){//開始メーカーを探すbytesRecvd =0; //見つかった場合、受信したバイトを0に設定しますreadInProgress =true; //読み取り中をtrueに設定}}} // 8 =============Dvoid processData()//データ型 " " {char * strtokIndx; //これはstrtok()によってインデックスとして使用されますstrtokIndx =strtok(inputBuffer、 "、"); //最初の部分を取得しますpanServoAngle =atof(strtokIndx); //この部分をfloatに変換しますstrtokIndx =strtok(NULL、 "、"); // 2番目の部分を取得します(これは前の呼び出しが中断されたところから続きます)tiltServoAngle =atof(strtokIndx); //この部分をfloatに変換しますstrtokIndx =strtok(NULL、 "、"); //最後の部分を取得しますLED_state =atoi(strtokIndx); //この部分を整数に変換します(stringからint)} // 8 =============Dvoid replyToPC(){if(newDataFromPC){newDataFromPC =false; Serial.print( "<"); Serial.print(panServo.read()); Serial.print( "、"); Serial.print(tiltServo.read()); Serial.println( ">"); }} // 8 =============Dvoid moveServo(){panServo.write(panServoAngle); tileServo.write(tiltServoAngle);} void setLED(){if(LED_state ==2){digitalWrite(redledPin、LOW); digitalWrite(yellowledPin、HIGH); digitalWrite(greenledPin、LOW); } else if(LED_state ==1){digitalWrite(redledPin、LOW); digitalWrite(yellowledPin、LOW); digitalWrite(greenledPin、HIGH); } else if(LED_state ==0){digitalWrite(redledPin、HIGH); digitalWrite(yellowledPin、LOW); digitalWrite(greenledPin、LOW); } else if(LED_state ==3){digitalWrite(redledPin、HIGH); digitalWrite(yellowledPin、HIGH); digitalWrite(greenledPin、HIGH); } else {digitalWrite(redledPin、LOW); digitalWrite(yellowledPin、LOW); digitalWrite(greenledPin、LOW); }} // 8 =============D void start_sequence(){panServo.write(90); tileServo.write(90); delay(300); digitalWrite(redledPin、HIGH); delay(100); digitalWrite(redledPin、LOW); digitalWrite(yellowledPin、HIGH); delay(100); digitalWrite(yellowledPin、LOW); digitalWrite(greenledPin、HIGH); delay(100); digitalWrite(redledPin、LOW); digitalWrite(yellowledPin、LOW); digitalWrite(greenledPin、LOW); delay(100); digitalWrite(redledPin、HIGH); digitalWrite(yellowledPin、HIGH); digitalWrite(greenledPin、HIGH); delay(100); digitalWrite(redledPin、LOW); digitalWrite(yellowledPin、LOW); digitalWrite(greenledPin、LOW); }
顔検出ソフトウェア
これは、顔検出ソフトウェアのファイルを見つけることができるリポジトリです。実行可能バージョンは、私のWebサイトでも見つけることができます。https://github.com/LittleFrenchKev/face_tracking_camera カスタムパーツとエンクロージャー
顔追跡カメラパーツ
顔追跡カメラミニを構築するために必要なすべての部品。こちらからも見つけることができます:https://www.littlefrenchkev.com/downloadCADファイル(thingiverse.com ) 回路図
製造プロセス