デジタルな日々

Pythonで4つのカメラを同時表示(Macで)


 

UnityでうまくいかなかったのでOpenCVを使ったPythonでなんとかしちゃる!!

 

というすごい意気込みがあったわけではなく、
Pythonで4台同時に出来なかったら積みだな…と半ば諦めかけていた

 

でも試しにカメラ4つを同時に表示してみたら(別々のウィンドウで)
できちゃった!!

 

そんな!!

 

しかも解像度もしっかり反映されるぞ!!

 

ウソでしょ!??

 

スクリプト
(ちなみにPythonとOpenCVはHomebrewでインストールしました)
(OpenCVをインストールしたら「Pyhonで使うならこのコマンド実行しとけ」って言われたので言われたとおりにしました)

#!/usr/bin/python

import cv2.cv as cv
import time

width = 320
height = 240

cv.NamedWindow(“camera”, 1)

capture = cv.CaptureFromCAM(1)

cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_FRAME_WIDTH,width)
cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_FRAME_HEIGHT,height)

capture2 = cv.CaptureFromCAM(2)

cv.SetCaptureProperty(capture2,cv.CV_CAP_PROP_FRAME_WIDTH,width)
cv.SetCaptureProperty(capture2,cv.CV_CAP_PROP_FRAME_HEIGHT,height)

capture3 = cv.CaptureFromCAM(3)

cv.SetCaptureProperty(capture3,cv.CV_CAP_PROP_FRAME_WIDTH,width)
cv.SetCaptureProperty(capture3,cv.CV_CAP_PROP_FRAME_HEIGHT,height)

while True:
img = cv.QueryFrame(capture)
cv.ShowImage(“camera1”, img)

img2 = cv.QueryFrame(capture2)
cv.ShowImage(“camera2”, img2)

img3 = cv.QueryFrame(capture3)
cv.ShowImage(“camera3”, img3)

if cv.WaitKey(10) > 0:
break
cv.DestroyAllWindows()

 

解像度を上げ過ぎるとクラッシュすることも判明した

 

じゃあUnityのエラーは何だったんだ!謎は深まるばかり

 

 

まあとにかく行けそうなのでやってみよう

 

Pythonで3Dオブジェクトを扱うにはPyOpenGLが必要らしい

 

PyOpenGLのインストールは簡単
ターミナルで

sudo pip install PyOpenGL PyOpenGL_accelerate

と打って実行するだけ
(sudoつけないとエラーになった)

 

 

そしてためしに3Dの立方体を表示してみる

 

 

#!/usr/bin/env python
#coding:utf-8
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys

angle = 0.0

def main():
glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(300, 300) # ウィンドウサイズ
glutInitWindowPosition(100, 100) # ウィンドウ位置
glutCreateWindow(“キューブ回転”) # ウィンドウを表示
glutDisplayFunc(display) # 描画コールバック関数を登録
glutReshapeFunc(reshape) # リサイズコールバック関数の登録
glutIdleFunc(idle)
init(300, 300)
glutMainLoop()

def init(width, height):
“””初期化”””
glClearColor(0.0, 0.0, 0.0, 1.0)
glEnable(GL_DEPTH_TEST) # 隠面消去を有効に

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, float(width)/float(height), 0.1, 100.0) # 投影変換

def display():
“””描画処理”””
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
# 視野変換:カメラの位置と方向のセット
gluLookAt(3.0, 2.0, 4.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) # 右斜め上から撮影
glRotatef(angle, 3.0, 2.0, 1.0)

draw_cube() # 立方体を描く

#glFlush() # OpenGLコマンドの強制実行
glutSwapBuffers()

def reshape(width, height):
“””画面サイズの変更時に呼び出されるコールバック関数”””
glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, float(width)/float(height), 0.1, 100.0)

def idle():
global angle
angle += 0.05 # 角度を更新
glutPostRedisplay() # 再描画

def draw_cube():
“””立方体を描く”””
# glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)

glBegin(GL_QUADS)
# 上面(緑)
glColor3f(0.0, 1.0, 0.0)
glVertex3f(1.0, 1.0, -1.0) # A
glVertex3f(-1.0, 1.0, -1.0) # B
glVertex3f(-1.0, 1.0, 1.0) # C
glVertex3f(1.0, 1.0, 1.0) # D
# 下面(オレンジ)
glColor3f(1, 0.5, 0)
glVertex3f(1.0, -1.0, -1.0) # E
glVertex3f(-1.0, -1.0, -1.0) # F
glVertex3f(-1.0, -1.0, 1.0) # G
glVertex3f(1.0, -1.0, 1.0) # H
# 前面(赤)
glColor3f(1.0, 0.0, 0.0)
glVertex3f(1.0, 1.0, 1.0) # D
glVertex3f(-1.0, 1.0, 1.0) # C
glVertex3f(-1.0, -1.0, 1.0) # G
glVertex3f(1.0, -1.0, 1.0) # H
# 背面(黄色)
glColor3f(1.0, 1.0, 0.0)
glVertex3f(1.0, 1.0, -1.0) # A
glVertex3f(-1.0, 1.0, -1.0) # B
glVertex3f(-1.0, -1.0, -1.0) # F
glVertex3f(1.0, -1.0, -1.0) # E
# 左側面(青)
glColor3f(0.0, 0.0, 1.0)
glVertex3f(-1.0, 1.0, 1.0) # C
glVertex3f(-1.0, 1.0, -1.0) # B
glVertex3f(-1.0, -1.0, -1.0) # F
glVertex3f(-1.0, -1.0, 1.0) # G
# 右側面(マゼンタ)
glColor3f(1.0, 0.0, 1.0)
glVertex3f(1.0, 1.0, 1.0) # D
glVertex3f(1.0, 1.0, -1.0) # A
glVertex3f(1.0, -1.0, -1.0) # E
glVertex3f(1.0, -1.0, 1.0) # H
glEnd()

if __name__ == “__main__”:
main()

 

 

んでこれをカメラのと組み合わせたいんだけどなかなかうまくいかないね

 

 

 

つづく…??

 

 

コメントを残す