OpenCV
python3
ubuntu16.04

OpenCVでWebカメラからの画像取得に失敗する時のメモ(Ubuntu16.04)

動作環境

ソフトウェア

  • Python 3.5.3
  • OpenCV 3.4

ハードウェア(Webカメラ)

このカメラはビックカメラで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を実行して画像が表示できていれば解決。

cam.jpg

以上。