MeanShiftを使って、カメラが物体を追いかけることを実現する準備として、カメラの動作確認をします。
カメラはLogicool C525です。
Raspberry Piとカメラを接続する
カメラのUSBをRaspberry Piに接続します。
プログラムで実現することを決める
C525は、最大で1280 x 720の解像度ですが、ここまで大きい必要は無いので640 x 480で取得します。
取得した画像を1枚ファイルに保存します。その後、キーボードで’q’が押されるまでWebカメラは動作し続けます。
‘q’を押すとき、OpenCVのウィンドウを選択している必要があります。
プログラムを設計する
短く簡単なプログラムなので、設計は必要ありません。
プログラムを実装する
ソースコードを掲載します。
test_camera.py
# -*- coding: utf-8 -*-
#! /usr/bin/python
#! /usr/bin/env python
# [USAGE]
#
# python open_cv_test_camera.py
# ------------------------------------------------------------------------------
## OpenCV 3.2
import cv2 as open_cv
## Time
import time
# ------------------------------------------------------------------------------
WIDTH = 640
HEIGHT = 480
# ------------------------------------------------------------------------------
## create instance
video_capture = open_cv.VideoCapture(0)
if video_capture.isOpened():
print('video capture: 0')
else:
video_capture = open_cv.VideoCapture(1)
if video_capture.isOpened():
print('video capture: 1')
else:
print('can not get video capture')
quit()
# ------------------------------------------------------------------------------
## Width
## set property
## Logicool C525 : 0 - 1280
video_capture.set(open_cv.CAP_PROP_FRAME_WIDTH, WIDTH)
# ------------------------------------------------------------------------------
## Hight
## set property
## Logicool C525 : 0 - 720
video_capture.set(open_cv.CAP_PROP_FRAME_HEIGHT, HEIGHT)
# ------------------------------------------------------------------------------
## get a frame
ret, frame = video_capture.read()
open_cv.imwrite("000_frame.png", frame)
if frame is None:
print("ERROR")
# ------------------------------------------------------------------------------
while True:
## input q -> quit
k = open_cv.waitKey(1)
if k == ord('q'):
break
## get a frame
ret, frame = video_capture.read()
if ret == True:
open_cv.imshow('SHOW IMAGE', frame)
time.sleep(0.1)
else:
break
video_capture.release()
open_cv.destroyAllWindows()
動作確認する
綺麗さ、速さ、の両方について想像以上に良い映像が得られるかと思います。
ときどき、open_cv.VideoCapture(0)とopen_cv.VideoCapture(1)の両方に失敗します。そのときは、スクリプトの実行を繰り返してください。