SSブログ

Raspberry Pi で OpenCV [Raspberry Pi]

Raspberry Pi に OpenCV をインストールして、顔認識を試してみた。

OpenCVのインストール
 OpenCVをソースからビルドするのは時間がかかるので、今回はバイナリをインストールすることにした。

 % wget https://github.com/mt08xx/files/raw/master/opencv-rpi/libopencv3_3.4.1-20180304.1_armhf.deb
 % sudo apt install ./libopencv3_3.4.1-20180304.1_armhf.deb
 % sudo ldconfig

 動作確認
 % python -c 'import cv2; print(cv2.__version__)'
 3.4.1
 % python3 -c 'import cv2; print(cv2.__version__)'
 3.4.1

 ちゃんとOpenCVのバージョンが表示されてるので、インストールされている様子。


お試し1 画像ファイルの顔認識テスト
 OpenCVには最初から顔検出器用が用意されているのでそれを使用してみる。

 % vi face.py (ブログの都合上全角スペースでインデントしているので修正が必要かも)
  import cv2
  import os

  def face_detector(img_path, ):
   img = cv2.imread(img_path, cv2.IMREAD_COLOR)
   gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
   face = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

   if len(face) > 0:
    for rect in face:
     cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (255, 255, 255), thickness=2)
   else:
    print("no face")

   cv2.imshow("result", img)
   cv2.imwrite("outimg/" + os.path.basename(img_path), img);
   key = cv2.waitKey(0)

  cascade_path = "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"
  faceCascade = cv2.CascadeClassifier(cascade_path)

  img_files = os.listdir('inimg')
  for img_file in img_files:
   full_path_name = 'inimg/' + img_file
   print(full_path_name)
   face_detector(full_path_name)

 % mkdir inimg outimg

 顔が入っている適当な画像ファイルを inimgディレクトリに置いて、実行すると、
 顔を認識した部分に白い枠を追加して画像表示し、outimgディレクトリに出力してくれる。

 % pytone3 face.py

 うまく顔認識していることが確認出来た。


お試し2 USBカメラからのキャプチャ
 ラズパイ用のカメラもジュールは持っていないけどUSBにつなぐWebカメラ(130万画素)は持っているので、
 キャプチャしてみる。

 % vi getcamera.py (ブログの都合上全角スペースでインデントしているので修正が必要かも)
  import cv2

  def camera_capture():
   cap = cv2.VideoCapture(0)

   while True:
    ret, frame = cap.read()
    cv2.imshow('camera capture', frame)

    key = cv2.waitKey(1)
    if key == 27:
     break

    cap.release()
    cv2.destroyAllWindows()

  camera_capture()

 % python3 getcamera.py

 ちゃんとカメラから取り込んだ画像(640x480くらい)が15〜20フレーム/secくらいで表示された。
 ESCキーを押すと終了する。


お試し3 USBカメラからキャプチャして顔認識
 お試し1と2を組み合わせてリアルタイム顔認識を試してみる。

 % vi camera_face.py (ブログの都合上全角スペースでインデントしているので修正が必要かも)
  import cv2

  def camera_capture():
   cap = cv2.VideoCapture(0)

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

    gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
    face = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

    if len(face) > 0:
     for rect in face:
      cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (255,255,255), thickness=1)

    cv2.imshow('camera capture', frame)

    key = cv2.waitKey(1)
    if key == 27:
     break

   cap.release()
   cv2.destroyAllWindows()

  cascade_path = "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"
  faceCascade = cv2.CascadeClassifier(cascade_path)

  camera_capture()

 % python3 camera_face.py

 リアルタイムに顔認識出来るようになった。
 ただし 1〜2フレーム/sec とだいぶ遅くなった。

参考にしたサイトはここです。
http://uepon.hatenadiary.com/entry/2018/02/12/113432
https://qiita.com/mt08/items/e8e8e728cf106ac83218
https://tomosoft.jp/design/?p=8876


nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Raspberry Pi で Tenso..WindowsにOpenCV ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。