前提・実現したいこと
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