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