質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

2回答

8208閲覧

PythonでOpenCVのVideoCaptureの例外が取得できない

TakakiKuwabara

総合スコア38

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

1クリップ

投稿2017/09/13 09:34

編集2017/09/15 07:56

PythonのOpenCVでWEBカメラからビデオキャプチャーを利用しています。
OpenCVでは下記の通りに番号でWEBカメラを指定しますが、複数カメラを利用する際に、番号で指定したカメラが存在しない場合、例外エラーが発生します。
この例外を取得したいのですが、何故か try exception に引っかからないのです。

わかる方がいらっしゃればお教えいただけないでしょうか。

Python3

1 import cv2 2 3 4 cam_num = 0 5 cap = None 6 7 while True: 8 try: 9 # カメラデバイスを取得 10 cap = cv2.VideoCapture(cam_num) 11 12 except: 13 # 4つのポートを走査してもカメラが取得できなかった場合、セットアップを中止する 14 if cam_num >= 4: 15 self.removeCamera(line_id) 16 17 # 次のデバイスで試してみる 18 else: 19 cam_num += 1

エラー何用については下記の通りです。

Python3

1OpenCV: out device of bound (0-0): 1 2OpenCV: camera failed to properly initialize!
退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2017/09/13 09:43

どのような例外が発生しますか?(unknown C++ exception!?)
can110

2017/09/14 00:41

提示コードにcv2.resize呼出部分も含めて下さい。コードとエラー情報が異なるため、適切な回答ができない可能性が高いです。
TakakiKuwabara

2017/09/15 07:57

resizeは関係なかったです。単にcaptureできてないのにリサイズしようとしていただけでした。
can110

2017/09/15 08:41

そもそもなのですが、なぜ(pythonの)例外エラーが発生していると判断されているのでしょうか?
TakakiKuwabara

2017/09/16 10:07

???デバッグでエラーが発生しているからじゃないのですか?
can110

2017/09/17 11:45

回答&コメントに追記しています。確認の上、エラーと判断された理由を追記ください。
guest

回答2

0

原因などはmt08さんの回答のとおりだと思います。
加えて、例外を捕捉したい場合はexcept cv2.errorでできます。
参考 : How to catch “OpenCV Error” in Python

Python

1import cv2 2try: 3 cap = cv2.VideoCapture(123) 4 print(cap.isOpened()) 5 ret, frame = cap.read() 6 print(ret) 7 print(frame) 8 cv2.resize(frame, (200,300)) 9except cv2.error: 10 print('cv2.error')

実行結果(resizeでの例外を捕捉)

False False None OpenCV Error: Assertion failed (ssize.area() > 0) in cv::resize, file ..\..\..\modules\imgproc\src\imgwarp.cpp, line 3229 cv2.error

ちなみに上記のコードの最後の2行を以下に変えても、cv2.resizeで発生する例外は捕捉できていますし

Python

1except: 2 print('except')

cv2.resize(frame, (200,300))をコメントアウトすると、例外は発生せずプログラムは正常終了します。

以上の検証結果よりcap = VideoCapture(~では例外は発生しないと判断しています。
この検証結果を踏まえ、採るべき対応はmt08さんの回答のとおりと考えます。

投稿2017/09/14 01:05

編集2017/09/15 09:31
can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakakiKuwabara

2017/09/15 07:58

試してみましたが補足できませんでした。 > OpenCV: out device of bound (0-1): 2 > OpenCV: camera failed to properly initialize! この出力でprintが実行されませんでした。
can110

2017/09/15 08:48

回答に示したコードをそのまま実行しても False False も表示されずに OpenCV: out device of bound (0-1): 2 OpenCV: camera failed to properly initialize! が表示されてプログラムが終了するということでしょうか?
guest

0

TakakiKuwabaraさん、

VideoCapture() では、例外が発生しないんじゃないでしょうか?

cap = cv2.VideoCapture(cam_num) で、インスタンス取得後、cap.isOpened()で、Falseが返ってきたら、カメラは使えない => 存在しない、としてはどうでしょうか?

カメラの初期化できていない、フレームの取得ができていないのに、resize()しようとしての例外ですかね?

  • 参考
pi@raspberrypi:~ $ python Python 2.7.13 (default, Jan 19 2017, 14:48:08) [GCC 6.3.0 20170124] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> cap = cv2.VideoCapture(123) >>> cap.isOpened() False >>> ret, frame = cap.read() >>> ret False >>> frame >>> >>> cv2.resize(frame, (200,300)) OpenCV Error: Assertion failed (ssize.area() > 0) in resize, file /build/opencv-U1UwfN/opencv-2.4.9.1+dfsg1/modules/imgproc/src/imgwarp.cpp, line 1834 Traceback (most recent call last): File "<stdin>", line 1, in <module> cv2.error: /build/opencv-U1UwfN/opencv-2.4.9.1+dfsg1/modules/imgproc/src/imgwarp.cpp:1834: error: (-215) ssize.area() > 0 in function resize >>>

投稿2017/09/13 17:52

編集2017/09/13 17:53
mt08

総合スコア1825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakakiKuwabara

2017/09/14 00:26

本文にも書いてある通り、VideoCapture の例外です。 > VideoCapture() では、例外が発生しないんじゃないでしょうか? それはわかっていて例外の取得を質問しているのですが。。。
mt08

2017/09/14 00:33 編集

添付されたエラーログでは、cv2.resize() でエラー吐いてるから、そこで例外をキャッチしたい?ということ? > cv2.error: ~~~~~ in function resize
TakakiKuwabara

2017/09/15 07:57

resizeは関係なかったです。単にcaptureできてないのにリサイズしようとしていただけでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問