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
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
2018-04-01 00:20
nice!(0)
コメント(0)
コメント 0