2017年3月8日水曜日

OpenCV3 でカメラを使って静止画を撮影

概要

わざわざ OpenCV を使う必要が全くないのだが、せっかく Mac にインストールしたので Mac の Web カメラを使って OpenCV3 で静止画 ( 写真 ) を撮ってみました

環境

  • Mac OS X 10.11.3
  • Python 3.5.1
  • Numpy 1.10.4
  • OpenCV 3.1.0

Python スクリプト

Mac 内臓のカメラを起動して静止画を撮影するスクリプトです
OpenCV3 が使える環境があればそのまま実行するだけで使えるはずです

import numpy as np
import cv2
import datetime

print("Start capturing camera")
cap = cv2.VideoCapture(0)
# Default size: 780 x 1280
# cap.set(cv2.CAP_PROP_FRAME_WIDTH, 240)
# cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv2.imshow('frame', gray)

    if cv2.waitKey(33) & 0xFF == ord('q'):
        break
    elif cv2.waitKey(33) & 0xFF == ord('s'):
        now = datetime.datetime.now()
        filename = now.strftime("%Y%m%d_%H%M%S")
        print(filename)
        cv2.imwrite(filename + '.png', frame)
        img = cv2.imread(filename + '.png')
        # height, width = img.shape[:2]
        # f = open(filename + '_pixels.txt', 'w')
        # f.write(','.join(str(v) for v in img.tolist()))
        # f.close()
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

ポイント説明

実行するとカメラが起動します
カメラのサイズは cap.set(cv2.CAP_PROP_FRAME_WIDTH, 240), cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) で指定することができます

カメラは静止画を連続的に映すことで動画にしています
なので cv2.imshow('frame', gray) までの流れは while ループ内に入れる必要があります

cv2.waitKey(33) & 0xFF で入力されるキーを 33ms だけ待ちます
もちろん 33ms 内に入力がない場合は再度、動画を映すために while ループの先頭に戻ります
この 33ms の時間を伸ばすとキー入力の待ち時間は長くなるのですが、逆にその間 cv2.imshow('frame', gray) が呼ばれないためカメラが止まった状態になってしまいます

33ms の間にキー入力がありかつ入力されたキーが q だった場合は終了します
s だった場合に静止画を撮影します
撮影自体は cv2.imwrite(filename + '.png', frame) で行っています
今回はファイル名がかぶらないように日時をファイル名に付与しています

全体の流れは以上です
あとはおまけて画像の情報を取得するロジックをコメントアウトで記載しています

最後に

紹介は以上です
説明書いていて気づいたんですが、カメラを起動した状態でイベント等が発生したら静止画を撮るみたいなことってどうやって実現するんだろうと思いました
うーん、機会があれば挑戦したい

参考サイト

0 件のコメント:

コメントを投稿