動作環境
ソフトウェア
- Python 3.5.3
- OpenCV 3.4
ハードウェア(Webカメラ)
- logicool c270(製品ページ)
このカメラはビックカメラで1000円だったので買った。静止画で300万画素。最近のWebカメラはUVCだからUbuntuでも問題なく使える。好きなのを使えばいいと思う。
USB video device class (UVC) | Wikipedia
動作確認
USBが認識されているか確認。
$ lsusb
Bus 001 Device 003: ID 046d:0825 Logitech, Inc. Webcam C270
ビデオとして認識されているか確認。
$ l /dev/video*
/dev/video0
0chのカメラにアクセスすれば良さそう。
Webカメラから画像を取得する方法
以下のコードを適当な名前で保存する。0chから取得するのでcv2.VideoCapture(0)
としている。
capture.py
# !/usr/bin/env python3
# -*-coding: utf-8 -*-
import cv2
import time
def main():
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
if ret:
cv2.imshow('frame', frame)
else:
time.sleep(2)
# Display the resulting frame
if cv2.waitKey(20) == 27:
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
main(args)
以下を実行すればWebカメラから画像を取得できる。実行時にはsudo
をつけるのを忘れないこと。
$ sudo ./capture.py
エラーが発生して画像の取得に失敗する時
上記でそのまま画像が取得できれば問題ないが、以下のようなエラーが発生することがある。
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
Major opcode: 62 (X_CopyArea)
Resource id: 0x3600010
解決策その1(保存する)
cv2.imshow()
をやめてcv2.imwrite()
を利用すれば正常に取得できているはず。しかし、不便である。
解決策その2(profileを修正)
以下のページを参考にした。
BadDrawable (invalid Pixmap or Window parameter) #53
/etc/environment
をエディタで開く。ここではnanoを使用する。
$ sudo nano -w /etc/environment
最終行に以下を追加する。
QT_X11_NO_MITSHM=1
再びsudo ./capture.py
を実行して画像が表示できていれば解決。
以上。