ゆるエンジニアはいろいろ遊びたい

FAエンジニアが週末にいろいろ遊ぶブログです

カメロボにカメラを付けてみた

以前ラズパイカーを作った時に、ラズパイのカメラモジュールV2を使ったのですが、ラズパイカーは現在カメロボになってしまったので、カメラだけ余っている状況です。
思えばカメラの実装はかなり大変で、結局ラズパイゼロ2WのOSバージョンをBullsayeにしたり、チャッピーでは解決できなかったのでいろいろなサイトを検索したりして苦労の末実装できたのはいい思い出。
slowtech.hateblo.jp
せっかくなので、カメロボにも実装して人物の認識とカメラの追従をしていみたいと思います。
まずはラズパイにカメラを接続するのですが、これが結構大苦戦しました。
カメラモジュールのフラットケーブルはハリがある素材なので、カメロボ内の込み入った配線に対して取りまわしが非常に難しい。
せっかく接続してもラズパイ側のロック部分が弱すぎてすぐ外れます。
なんとかがんばって取り付けても、なんとカメラを認識しません。
ここで大きな罠があったのですが、カメラのレンズ側に基盤と接続するコネクタがあり、これがちょっと浮いていたのでした。

↑この黒いやつが浮いていた・・・
ひとしきり焦り散らかして、ネットにこの部分が浮いていて認識しなかったという記事を見つけてようやく解決。
カメラの上下機構はMiuzeiの安いサーボでOK。3Dプリンタで取り付けステーを作りました。


次はラズパイ側です。
モジュールはOpenCVを使います。

sudo apt install python3-opencv

続いて、顔検出の学習データを取得し、python実行ファイルと同じディレクトリに保存します。

wget https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml

顔検出のプログラムを記述します。

import cv2
import time

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)

if not cap.isOpened():
    print("カメラ開けない")
    exit()

face_cascade = cv2.CascadeClassifier(
    "haarcascade_frontalface_default.xml"
)

print("顔検出スタート")

while True:
    ret, frame = cap.read()
    if not ret:
        continue

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    if len(faces) > 0:
        print("顔検出!", faces[0])

    time.sleep(0.1)

実行すると

顔検出! [262 107  55  55]

のように認識できていることが確認できました。
これをロボに組み込みたいと思います。
今回はここまで。