製作しているバレットタイム撮影システムで各カメラの視線が一点に定まっていないと生成した動画がブレる。しかし,全てのカメラの視線を一点に集めるのは至難の技。そこで,撮影した画像をソフトウェアで処理して視線合わせを行うことにした。画像処理プログラムは書いたことがないのでゼロから学んで行く。

NT金沢やMaker Faire TokyoでOpenCVを使えば簡単と聞いたので,Python + OpenCV の環境下で試行して見る。

OpenCVのインストール
$ sudo apt-get install libopencv-dev
$ sudo apt-get install python-opencv

2016/4/4  Rasbianを最新にしたら「GdkGLExt-WARNING **: Window system doesn’t support OpenGL.」が出たので次をインストール

$ sudo apt-get install libgl1-mesa-dri

Pythonを起動しimport cv2 でエラーが出なければインストールOK

$ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>>
USBカメラでキャプチャして表示
import cv2

#キャプチャデバイスの設定 0:/dev/video0
cap = cv2.VideoCapture(0)

while(1):

    # キャプチャデバイスから1フレーム読む
    ret, frame = cap.read()

    # サイズを320x240に変更
    frame = cv2.resize(frame,(320,240))

    # 表示
    cv2.imshow('frame',frame)

    # ESCキーが押されたらwhileループを抜ける
    k = cv2.waitKey(5) & 0x7F
    if k == 27:
        break

# 表示ウインドウを閉じる
cv2.destroyAllWindows()
赤色を抜き出す
import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

    # Take each frame
    ret, frame = cap.read()
    frame = cv2.resize(frame,(320,240))

    # Convert BGR to HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # define range of target color in HSV
    lower_color = np.array([0,150,150])
    upper_color = np.array([25,255,255])

    # Threshold the HSV image to get only blue colors
    mask = cv2.inRange(hsv, lower_color, upper_color)

    # Bitwise-AND mask and original image
    res = cv2.bitwise_and(frame,frame, mask= mask)

    # show
    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0x7F
    if k == 27:
        break

cv2.destroyAllWindows()
赤色マーカをトラッキング
import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

    # Take each frame
    ret, frame = cap.read()
    frame = cv2.resize(frame,(320,240))

    # Convert BGR to HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # define range of target color in HSV
    lower_color = np.array([0,150,150])
    upper_color = np.array([25,255,255])

    # Threshold the HSV image to get only blue colors
    mask = cv2.inRange(hsv, lower_color, upper_color)

    # Take the moments to get the centroid
    moments = cv2.moments(mask)
    m00 = moments['m00']
    centroid_x, centroid_y = None, None
    if m00 != 0:
        centroid_x = int(moments['m10']/m00)
        centroid_y = int(moments['m01']/m00)

    # Assume no centroid
    ctr = (-1,-1)

    # Use centroid if it exists
    if centroid_x != None and centroid_y != None:
        ctr = (centroid_x, centroid_y)
        # Put disk in at centroid in image
        cv2.circle(frame, ctr, 4, (255,255,255),-1)

    # Bitwise-AND mask and original image
    res = cv2.bitwise_and(frame,frame, mask= mask)

    cv2.imshow('frame',frame)
    #cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0x7F
    if k == 27:
        break

cv2.destroyAllWindows()

赤色マーカをトラッキング