リアルタイムに視線を検出するために,まずはカメラ映像を受け取るところから始めます. 今回はOpenCVを使用してカメラ映像をリアルタイムに描画する方法を紹介します. PCに内蔵カメラが付いていない場合はスマートフォンをWebカメラとして使用することができます.
以下のコードで簡単にリアルタイム映像を描画することができます. このコードはカメラが使用できる状態でなければ動きません.
error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
というエラーが出た場合は映像が受け取れていませんので,カメラの設定の確認(プライバシーの設定→カメラ)や外部カメラの接続を行う必要があります.
import cv2
# VideoCaptureオブジェクトの作成
capture = cv2.VideoCapture(0) # 複数のカメラが接続されている場合は引数で指定できます
# 解像度の変更
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
print(f"解像度: {capture.get(cv2.CAP_PROP_FRAME_WIDTH)}×{capture.get(cv2.CAP_PROP_FRAME_HEIGHT)}")
while(True):
ret, frame = capture.read()
cv2.imshow('frame',frame)
# エスケープキーが押されたら終了
if cv2.waitKey(1) == 27:
break
# カメラを終了しウィンドウを閉じる
capture.release()
cv2.destroyAllWindows()
【関連(外部サイト)】OpenCV CV2 waitkeyの一覧
キーが押されたときの処理をwaitKeyで書きますが,そのときに指定するキー番号の一覧です.(矢印キーのみ扱いに注意)
【関連(外部サイト)】note.nkmk OpenCV
拡大・縮小 切り出し 図形の描画などの具体的な使用例
【関連(外部サイト)】OpenCV - Open Computer Vision Library
カメラが内蔵されておらず,Webカメラを持っていない場合でも,スマートフォンをWebカメラとして使用することができます.
IP Webcamを使用して,スマートフォンをWebカメラとして使用します.
import requests
import cv2
import numpy as np
import imutils
# スマートフォンの画面に表示されたURLを使用する
url = "http://***.***.**.***:****/shot.jpg" # /shot.jpg を最後に付けること
while True:
img_resp = requests.get(url)
img_arr = np.array(bytearray(img_resp.content), dtype=np.uint8)
img = cv2.imdecode(img_arr, -1)
img = imutils.resize(img, width=1200, height=540)
cv2.imshow("Android_cam", img)
# エスケープキーが押されたら終了
if cv2.waitKey(1) == 27:
break
cv2.destroyAllWindows()
【参考(外部サイト)】Connect your android phone camera to OpenCV
IP Webcamの接続方法について解説しているサイト.
【関連(外部サイト)】 スマホをWEBカメラ化できるアプリがすごい
iVCamというアプリケーションを使用してスマートフォンをWebカメラ化する方法について解説しているサイトです.一度試して上手くいきませんでしたが紹介しておきます.
映像の取得ができたので次回は,dlibを使用した顔器官の検出方法について紹介します.