前提・実現したいこと
プログラミング初心者です。
https://ensekitt.hatenablog.com/entry/2018/06/13/200000
上記のサイトからコピペ、自分の環境(webカメラではなく一眼レフカメラを用いて撮影し、そのmp4を読み込む。)に合わせて使用できるようにしたいです。
動体検出・トラッキング自体は成功していますが、下記エラーが発生してしまいます。
frame = cap.read()が成功していない?様々な検討をしましたが解決に至れませんでした。
今後、動体の座標を出力し、処理したいので、エラーを無くすことが必要です。
宜しくお願い致します。
発生している問題・エラーメッセージ
AttributeError Traceback (most recent call last)
<ipython-input-1-f748fcc776d0> in <module>
11 frame = cap.read()
12 # スクリーンショットを撮りたい関係で1/2サイズに縮小
---> 13 frame = cv2.resize(frame, (int(frame.shape[1]/2), int(frame.shape[0]/2)))
14 # 加工なし画像を表示する
15 cv2.imshow('Raw Frame', frame)
AttributeError: 'tuple' object has no attribute 'shape'
該当のソースコード
python3.7.7
1import cv2 2 3cap = cv2.VideoCapture('111.mp4') 4 5ok = False 6before = None 7detected_frame = None 8bbox = (0,0,0,0) 9while True: 10 # OpenCVでWebカメラの画像を取り込む 11 frame = cap.read() 12 # スクリーンショットを撮りたい関係で1/2サイズに縮小 13 frame = cv2.resize(frame, (int(frame.shape[1]/2), int(frame.shape[0]/2))) 14 # 加工なし画像を表示する 15 cv2.imshow('Raw Frame', frame) 16 # 取り込んだフレームに対して差分をとって動いているところが明るい画像を作る 17 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 18 if before is None: 19 before = gray.copy().astype('float') 20 continue 21 cv2.accumulateWeighted(gray, before, 0.7) 22 mdframe = cv2.absdiff(gray, cv2.convertScaleAbs(before)) 23 # 動いているところが明るい画像を表示する 24 # cv2.imshow('MotionDetected Frame', mdframe) 25 26 # 動いているエリアの面積を計算してちょうどいい検知結果を抽出する 27 thresh = cv2.threshold(mdframe, 3, 255, cv2.THRESH_BINARY)[1] 28 image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 29 max_area = 0 30 target = None 31 for cnt in contours: 32 area = cv2.contourArea(cnt) 33 if max_area < area and area < 40000 and area > 4000: 34 max_area = area; 35 target = cnt 36 37 # 動いているエリアのうちそこそこの大きさのものがあればそれを矩形で表示する 38 # ちょうどいいエリアがなかったら最後の動いているエリアがあるフレームとエリア情報を用いてトラッキングをする 39 # どうしようもない時はどうしようもない旨を表示する 40 if max_area <= 4000: 41 track = False 42 if detected_frame is not None: 43 # インスタンスを作り直さなきゃいけないっぽい 44 tracker = cv2.TrackerKCF_create() 45 ok = tracker.init(detected_frame, bbox) 46 detected_frame = None 47 48 if ok: 49 track, bbox = tracker.update(frame) 50 if track: 51 p1 = (int(bbox[0]), int(bbox[1])) 52 p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3])) 53 cv2.rectangle(frame, p1, p2, (0,255,0), 2, 1) 54 cv2.putText(frame, "tracking", (10,50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1, cv2.LINE_AA) 55 else: 56 ok = False 57 cv2.putText(frame, "(^q^)", (10,50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1, cv2.LINE_AA) 58 else: 59 #areaframe = cv2.drawContours(frame, [target], 0, (0,255,0), 3) 60 x,y,w,h = cv2.boundingRect(target) 61 bbox = (x,y,w,h) 62 detected_frame = frame.copy() 63 frame = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2) 64 cv2.putText(frame, "motion detected", (10,50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1, cv2.LINE_AA) 65 66 cv2.imshow('MotionDetected Area Frame', frame) 67 # キー入力を1ms待って、k が27(ESC)だったらBreakする 68 k = cv2.waitKey(1) 69 if k == 27: 70 break 71 72# キャプチャをリリースして、ウィンドウをすべて閉じる 73cap.release() 74cv2.destroyAllWindows()
試したこと
openCV4.2の再インストール、3.4へのダウングレード
他の動画データを用いる
縮小無しでの実行
補足情報(FW/ツールのバージョンなど)
python3.7.7
openCV4.2
jupyter notebook
Anaconda Navigator
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/07 02:23