経緯
PythonのOpenCVを利用して複数台のカメラが乗っている場合、利用したいカメラを指定したかった。
OpenCVのVideoCaptureはindexの数値を指定するしか方法がない。そのindexが
USBの付ける位置によって毎回変わってしまうという糞仕様だった。せめて名前か何かユニークなもので判別して自動で利用するカメラを選びたかった人生。
手法
system_profiler
でWebカメラの情報を取って、部分一致した文字列で雑に使用するカメラを指定出来るようにした。
import sys
import subprocess
def get_camera_name(camera_name):
# カメラリストの取得
cmd = 'system_profiler SPCameraDataType | grep "^ [^ ]" | sed "s/ //" | sed "s/://" '
res = subprocess.run(cmd, stdout=subprocess.PIPE, shell=True)
# 出力結果の加工
ret = res.stdout.decode('utf-8')
camera_list = list(filter(lambda a: a != "", ret.split('\n')))
print(camera_list)
# 指定カメラの取得
for index, row in enumerate(camera_list):
if row.find(camera_name) != -1:
return index
raise Exception('指定カメラなし')
>>> get_camera_name('HD')
['FaceTime HD Camera', 'USB_Camera']
0
>>> get_camera_name('USB')
['FaceTime HD Camera', 'USB_Camera']
1
参考