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

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

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

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

Python 3.x

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

1回答

683閲覧

OpenCVで動いた箇所を矩形で囲みたい

fftcysstkm

総合スコア10

OpenCV

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

Python 3.x

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2018/11/28 15:00

前提・実現したいこと

Raspberry Piにカメラを接続して、動きがあった部分を検出して矩形で囲みたいと思っています。カメラは動作確認済みです。
下記を参考というかコピペさせていただき動かしてみたところ、エラーメッセージが出ました。
https://github.com/kujirahand/book-mlearn-gyomu/blob/master/src/ch3/video/diff_camera.py
調べてみたのですが、全く原因の見当が付きませんでした。
どなたか解決方法を教えていただけませんでしょうか。
よろしくお願いいたします。

発生している問題・エラーメッセージ

OpenCV Error: Assertion failed (points.checkVector(2) >= 0 && (points.depth() == CV_32F || points.depth() == CV_32S)) in boundingRect, file /build/opencv-U1UwfN/opencv-2.4.9.1+dfsg1/modules/imgproc/src/contours.cpp, line 1895 Traceback (most recent call last): File "diff_camera.py", line 28, in <module> x, y, w, h = cv2.boundingRect(pt) cv2.error: /build/opencv-U1UwfN/opencv-2.4.9.1+dfsg1/modules/imgproc/src/contours.cpp:1895: error: (-215) points.checkVector(2) >= 0 && (points.depth() == CV_32F || points.depth() == CV_32S) in function boundingRect

該当のソースコード

python

1# coding:utf-8 2import cv2 3 4 5cap = cv2.VideoCapture(0)#引数:カメラのデバイス番号か読み込みたい動画ファイル名を指定 6img_last = None#前回の画像を記録する変数。以下のループ内最後で更新 7green = (0, 255, 0) 8 9while True: 10 #画像を取得 11 _, frame = cap.read() 12 frame = cv2.resize(frame,(500,300)) 13 #白黒に二値化 14 gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) 15 gray = cv2.GaussianBlur(gray,(9,9),0)#ぼやかして細かいノイズ除去 16 img_b = cv2.threshold(gray,100,255,cv2.THRESH_BINARY)[1]#白黒100以上は白へ。 17 18 #差分を確認する。一番最初は、img_lastにimg_bを格納して次のループへ。 19 if img_last is None: 20 img_last = img_b 21 continue 22 frame_diff = cv2.absdiff(img_last, img_b)#入力画像の画素値の差分を出力。差があると0以外の値の画素値。 23 contours = cv2.findContours(frame_diff, 24 cv2.RETR_EXTERNAL, 25 cv2.CHAIN_APPROX_SIMPLE)[1]#画像を左上から走査して塊の輪郭を検出。 26 27 #差分があった箇所に緑の矩形を描く 28 for pt in contours: 29 x, y, w, h = cv2.boundingRect(pt) 30 if w < 30: continue#幅が小さい矩形(輪郭の外側を囲む)は無視 31 cv2.rectangle(frame,(x,y),(x+w,y+h),green,2) 32 33 #比較対象の「前回のフレーム」を今回のフレームで更新 34 img_last = img_b 35 cv2.imshow("Diff Camera",frame) 36 cv2.imshow("diff_data",frame_diff) 37 if cv2.waitKey(1)==13: break 38cap.release() 39cv2.destroyAllWindows()

環境

Raspbian 9.4
python 2.7.13
OpenCV 2.4.9.1

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

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

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

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

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

can110

2018/11/28 22:12

カメラはUSB接続したWebカメラまたは標準のpicameraのどちらでしょうか?
fftcysstkm

2018/11/29 05:46 編集

ご回答ありがとうございます。純正のカメラではないですがpicameraになります。また、ご指摘のデバイス番号の箇所を試してみます。
guest

回答1

0

cap = cv2.VideoCapture(0)でのカメラのデバイス番号違いなどで
cap.read()に失敗してframeが取得できていない可能性があります。
以下のように失敗したらループを抜けるようにしたほうがよいです。

Python

1# 略 2while True: 3 #画像を取得 4 ret, frame = cap.read() 5 if not ret: # 失敗したら終了 6 break 7# 略

まずは動画を扱うを参考にして、シンプルに動画表示できるか?から確認してみてください。
ちなみにネット上でRaspberryPiVideoCaptureする事例をいくつか見ていると
通常のWebカメラではなくpicameraからの取り込みにはデバイス番号は1を指定すべきなのかもしれません。(詳細未調査)

投稿2018/11/28 22:11

can110

総合スコア38234

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

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

fftcysstkm

2018/11/29 15:32 編集

デバイス番号を1にしてみましたが、別なエラーが出てしまいました。 ↓ HIGHGUI ERROR: V4L: index 1 is not correct! retがFalseのときにループをbreakするようにもしてみましたが変わらずでした。 参考にしたのはもしかすると、python3とOpenCV3向けのコードなんでしょうか。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問