PythonでUSBカメラ2台を使って録画したい
解決したいこと
PythonとOpenCVとTKinterでUSBカメラ2画面を表示し、ボタンで録画・ストップ(保存)をしたい
発生している問題・エラー
やろうとしていること
1.pythonでUSBカメラ2個を使って、所定の場所に所定のサイズで表示
2.TKinterで録画・ストップボタン(切り替わり)、終了ボタンを作成し他の場所に表示
3.ストップボタンを押したらファイルを保存
4.終了ボタンでカメラ、ボタンが消える
困りごと
1)ボタンでコントロールまでできていないので、qを押したら画面が消えるようにしたが(step1)
ループの使い方が理解できておらず、置く場所が間違っていると思うので以下の問題が起きている
問題:画面2画面表示し、qを押したらカメラが消え、ボタンが出てくる
→これが解決したらボタンでコントロールに移行したい(step2)
2)コードを短くしたい
・例えばVideoCapture(1)、VideoCapture(2)、frame1、frame2と同じ内容を数字を変えて書いているので一気にできないか
3)USBカメラが接続されていない場合エラーで止まってしまうので、カメラ画面が表示されない状態にしたい。
カメラが1個しかない場合、1つのみ表示にしたい。つないでない場合は表示されない、もしくはno cameraとか表示したい
以上よろしくお願いします。
該当するソースコード
python3.9、windows10
from datetime import datetime # 時刻関係のライブラリ
import cv2 # OpenCV のインポート
import tkinter as tk
#ポップアップ用メッセージボックスを表示するためのimport
from tkinter import messagebox as mb
#-------------------------------------
#ここからボタンなど作成
# Tkクラス生成
root= tk.Tk()
root.geometry('374x116+623+920') # 画面サイズ('X方向サイズxY方向サイズ+左上の座標)
root.title('Tanishi system ver 1.0') # 画面タイトル
# ボタン1(録画ボタン)作成
#
btn1 = tk.Button(root, text='録画', width=10,height=1,font=("","20","bold"))
# ボタンを左から配列
btn1.pack(side=tk.LEFT,expand=True,anchor=tk.CENTER)
# ボタン2(終了ボタン)作成
#
btn2 = tk.Button(root, text='終了', width=10,height=1,font=("","20","bold"))
# ボタンを左から配列
btn2.pack(side=tk.LEFT,expand=True,anchor=tk.CENTER)
#-------------------------------------ビデオキャプチャ
# VideoCaptureのインスタンスを作成(引数でカメラを選択できる)
cap1 = cv2.VideoCapture(1)
cap2 = cv2.VideoCapture(2)
while True:
# VideoCaptureから1フレーム読み込む
ret, frame1 = cap1.read() # 戻り値のframeがimg
ret, frame2 = cap2.read() # 戻り値のframeがimg
# 現在時刻の文字列を画像に追加
date = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
cv2.putText(frame1, date, (10,30), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 1, (0,255,0), 2, cv2.LINE_AA) #画像左上に時間表示
cv2.putText(frame2, date, (250,450), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 1, (0,255,255), 2, cv2.LINE_AA) #画像左上に時間表示
# 加工した画像を表示
#画像をアスペクト比を変えずにリサイズする
def scale_to_width (frame1, width):
h, w = frame1.shape[:2]
height = round(h * (width / w))
dst = cv2.resize(frame1, dsize=(width, height))
return dst
dst = scale_to_width (frame1, 440)
def scale_to_width_2 (frame2, width):
h, w = frame2.shape[:2]
height = round(h * (width / w))
dst2 = cv2.resize(frame2, dsize=(width, height))
return dst2
dst2 = scale_to_width_2 (frame2, 440)
#print(f"{img.shape} -> {dst.shape}")
#imshow(dst)
#画像の表示
cv2.imshow('Camera1', dst)#frame1)#
cv2.imshow('Camera2', dst2)#frame2)#
#画像の表示位置設定
cv2.moveWindow("Camera1", 1005,61) # Window表示位置指定
cv2.moveWindow("Camera2", 1460,61) # Window表示位置指定
# キー入力を1ms待って、keyが「q」だったらbreak
key = cv2.waitKey(1)&0xff
if key == ord('q'):
break
# キャプチャをリリースして、ウィンドウをすべて閉じる
cap1.release()
cap2.release()
cv2.destroyAllWindows()
root.mainloop()
1 likes