パーティクルフィルタを用いた物体追跡の実装を行なっているのですが追跡精度を高めるためにまずフレーム差分法を用いて、動物体の抽出をおこなってからその動物体の周りにパーティクルをランダムに配置したいのですが、パーティクルを乱数を用いて適当に配置することはできるのですが、フレーム差分法を用いて抽出した動物体の周りにランダムに配置するということをコードに起こせず困っています。フレーム差分法から得た動物体の周りを指定してパーティクルを配置するにはどうすれば良いでしょうか。
当方python初心者なためお力添いをおねがいします。
実行環境
jupyter python
フレーム差分による物体検出を行うコードは以下になります
python
1import cv2 2import numpy as np 3import time 4 5i = 0 # カウント変数 6th = 30 # 差分画像の閾値 7 8# 動画ファイルのキャプチャ 9cap = cv2.VideoCapture("zverev1.mp4") 10 11# 最初のフレームを背景画像に設定 12ret, bg = cap.read() 13 14# グレースケール変換 15bg = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY) 16 17while(cap.isOpened()): 18 # フレームの取得 19 ret, frame = cap.read() 20 21 # グレースケール変換 22 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 23 24 # 差分の絶対値を計算 25 mask = cv2.absdiff(gray, bg) 26 27 # 差分画像を二値化してマスク画像を算出 28 mask[mask < th] = 0 29 mask[mask >= th] = 255 30 31 # フレームとマスク画像を表示 32 cv2.imshow("Mask", mask) 33 cv2.imshow("Flame", gray) 34 cv2.imshow("Background", bg) 35 36 # 待機(0.03sec) 37 time.sleep(0.03) 38 i += 1 # カウントを1増やす 39 40 # 背景画像の更新(一定間隔) 41 if(i > 30): 42 ret, bg = cap.read() 43 bg = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY) 44 i = 0 # カウント変数の初期化 45 46 # qキーが押されたら途中終了 47 if cv2.waitKey(1) & 0xFF == ord('q'): 48 break 49 50cap.release() 51cv2.destroyAllWindows()
現状できているまでのコード、せめて動物体の抽出ができているところまでを提示されないと
なかなかアドバイスしにくいかと思います。
ご意見ありがとうございます。
コードとイメージを載せておきます。
コードはここに書くのではなく、質問を編集して追記してください
> 質問投稿後の画像の添付方法がわからなかった
質問を編集する画面でできます
https://teratail.com/help#posted-otherservice
を見てください
https://ja.stackoverflow.com/questions/90736/%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%AF%E3%83%AB%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E7%89%A9%E4%BD%93%E8%BF%BD%E8%B7%A1%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%AF%E3%83%AB%E3%81%AE%E9%85%8D%E7%BD%AE%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
ありがとうございます。変更させていただきます。ご迷惑おかけしました。
pythonのコードの一番最初の行のすぐ上に
```python
だけの行を追加してください
また、pythonのコードの一番最後の行のすぐ下に
```
だけの行を追加してください
または、
https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif
を見て、そのようにしてみてください
現状、コードがとても読み辛いです
質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
ご指摘ありがとう語彙ざいます。
なるべく自分で解決できるよう引き続き作業に取り組みます。
質問に追記していただいたコードですが、「while」や「if」の下にインデントが無いし、
if(i > 30): ret, bg = cap.read()
はおそらく二つの行が一つになってしまっていると思われるし、このままだと実行できないので、実行できるように直してください
変更しました。
ご指摘ありがとうございます
https://algorithm.joho.info/programming/python/opencv-particle-filter-py/
のコードでは、「initialize()」で全パーティクルを同じ座標で初期化してるようです
その座標は、「max_moment_point()」内で「cv2.connectedComponentsWithStats()」で取得してて、コードのコメントには「中心座標」と書かれてますけど、「重心」のようです
https://qiita.com/odaman68000/items/73eb101ba27af26057f1
のコードでも、「init_particles()」で全パーティクルを同じ座標で初期化してるようです
その座標は、「cv2.boundingRect()」で取得した外接矩形の中心座標のようです
回答1件
あなたの回答
tips
プレビュー