🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1399閲覧

OpenCVトラッカーを用いたプログラムのエラー除去

kyo00

総合スコア1

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/12/05 07:38

前提・実現したいこと

プログラミング初心者です。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因

frame = cv2.resize(frame, (int(frame.shape[1]/2), int(frame.shape[0]/2)))
AttributeError: 'tuple' object has no attribute 'shape'

は、frame.shape[1](とframe.shape[0])はTupleだから.shapeという処理はできないよ、ということを言っています。

これは、print(type(frame.shape[1]))で確認できますね。

エラーの詳細

もう少し見ると、
print(len(frame)) -->2
print(type(frame)) -->Tupleとなります。
あー、frame = (何か,何か)だったんだ!と分かります。

#解決策

もう気づいたかもしれませんね。

ret, frame = cap.read()
と使います。
retは取得できたかどうか、frameは画像本体です。

また、これが片付くと、OpenCVのバージョンによってはcv2.findContoursでコケるかもしれません。その時は、OpenCVを使った数字の認識プログラムの作成時でのboundingRectにおけるエラー(Python)が参考になると思います。

投稿2020/12/06 02:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kyo00

2020/12/07 02:23

retを使用し、falseだった時の処理を用意することで解決出来ました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問