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

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

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

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

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

0回答

681閲覧

動体追跡プログラムのループ処理がうまくいかない

shogaku

総合スコア2

OpenCV

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

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2020/12/08 07:30

編集2020/12/10 06:36

前提・実現したいこと

粒子群の移動の様子を撮影した動画を2値化し、フレームごとに分割した連番画像群が入力データです。
この画像に映った粒子を追跡し、1時刻・分割区間ごとに粒子移動量の収支を出力したいと考えています。
以下のようなフローでプログラムを実行させたいです。

範囲リストを2個生成 時刻n,n+1の画像をグレースケールで読み込み(画像枚数分繰り返し) ↓ nの粒子重心座標リスト l0 を生成し値を追加(粒子個数分繰り返し)     ↓     n+1の粒子重心座標リスト l1 を生成し値を追加(粒子個数分繰り返し)     ↓ 粒子移動後の座標を特定(l0の要素数分繰り返し)      追跡したい粒子より移動方向側にある粒子の座標リストl1eを生成し値を追加(l1の要素数分繰り返し)      最近傍法によって粒子の移動後の座標を特定 特定された座標の値を範囲リストに追加      特定された座標の値をl1から削除(特定先がかぶらないようにする為)      l1eを削除      ↓ 範囲リストの要素数をカウントして表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ la1: 前時刻の粒子数                   l0: 前時刻の粒子数 la2: 後時刻の粒子数 kinbou[x y]     kinbou[x y]                      ←これを画像枚数-1回出力  kinbou[x y]   ・     ←各時刻で対応する粒子数と同じ回数   ・   ・   ・ AA:AA、AB:ABリストの要素数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・

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

このうちfor e in range(len(l0)):より下で近傍点の座標をl0の要素の数だけ特定>範囲のリストに入れていくというループ処理をしたいのですが、リストAA、ABにはそれぞれの画像ごとに格納した座標の個数が一つしか(1回しか)格納されていない?ようです。これはやはりループ処理の組み方がおかしいのでしょうか

出力 la1: 1263 l0: 1263 la2: 1260 kinbou[801 136] kinbou[830 296] kinbou[963 193] AA:1 AB:0 la1: 1260 l0: 1260 la2: 1276 kinbou[800 143] kinbou[831 296] kinbou[961 185] kinbou[ 823 -181] AA:1 AB:0

該当のソースコード

import cv2 import numpy as np import csv from sklearn.neighbors import NearestNeighbors k = 1 AA = [] AB = [] n = 0 for n in range(2): img1 = cv2.imread('mask_%04d.jpg' % n,cv2.IMREAD_GRAYSCALE) img2 = cv2.imread('mask_%04d.jpg' % (n+1),cv2.IMREAD_GRAYSCALE) # ラベリング処理 label1 = cv2.connectedComponentsWithStats(img1) label2 = cv2.connectedComponentsWithStats(img2) # オブジェクト情報を項目別に抽出 la1 = label1[0] - 1 data1 = np.delete(label1[2], 0, 0) center1 = np.delete(label1[3], 0, 0) la2 = label2[0] - 1 data2 = np.delete(label2[2], 0, 0) center2 = np.delete(label2[3], 0, 0) print("la1:",la1) l0 = [] # 前時刻のオブジェクト情報を取得 for i in range(la1): l0 += [[int(center1[i][0]),int(center1[i][1])]] i += 1 if i == la1: break print("l0:",len(l0)) l1 = [] # 後時刻のオブジェクト情報を取得 for j in range(la2): l1 += [[int(center2[j][0]),int(center2[j][1])]] j += 1 if j == la2: break e = 0 print("la2:",la2) # 近傍点を特定 for e in range(la1): l1e = [] # 探査範囲内のオブジェクト情報を取得 for l in range(la2): if int(l1[l][0]) >= (int(l0[e][0]) - 5): l1e += [[int(l1[l][0]),int(l1[l][1])]] l += 1 else: l += 1 if l == la2: break if len(l1e) == 0: break l1e = np.array(l1e) #print("l1e:",len(l1e)) #モデル構築 knn_model = NearestNeighbors(n_neighbors=k, algorithm='brute').fit(l1e) distances, indices = knn_model.kneighbors([l0[e]]) #K個までのスライス、現在Kは1個 for rank, index in enumerate(indices[0][:k], start=1): str(rank) + " ==>",l1e[index] str(rank) + " ==>", distances[0][0] kinbou = l1e[index] l1 -= kinbou print("kinbou" + str(kinbou)) if distances[0][0] < 150 and 1920 >= kinbou[0] >= 0 and 2160 >= kinbou[1] >= 0 : AA += [kinbou] l1e = l1e.tolist() del l1e[:] e += 1 elif distances[0][0] < 150 and 3840 >= kinbou[0] > 1920 and 2160 >= kinbou[1] >= 0 : AB += [kinbou] l1e = l1e.tolist() del l1e[:] e += 1 print("AA" + ":" + str(len(AA)) + " " + "AB" + ":" + str(len(AB))) if img2 is None: print("can't read") break

イメージ説明
mask_0000.jpg
イメージ説明
mask_0001.jpg
イメージ説明
mask_0002.jpg

補足情報(FW/ツールのバージョンなど)

知識不足から、ところどころ頓珍漢なことをしているかもしれませんが、ご教授していただければ幸いです。
Windows10
python3.8
Opencv3

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

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

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

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

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

meg_

2020/12/08 10:41

> ループが上手く実行されません。 どういう状況でしょうか?エラーは出ていますか?
shogaku

2020/12/08 15:53

申し訳ありません、追記させていただきました。ご理解いただけなければ再度詳細を追記いたします。
meg_

2020/12/09 00:54

la1は粒子個数になっていますか?
shogaku

2020/12/09 06:14

そのフレームごとの粒子の個数と考えています。
meg_

2020/12/09 06:26

> そのフレームごとの粒子の個数と考えています。 設計について聞いているのではなく、プログラム中の実際の値がどうなっているのかについて聞いています。
shogaku

2020/12/09 11:45

追記いたしました。おそらくプログラム中のla1の値は粒子個数になっているとおもわれます。
meg_

2020/12/09 14:18

> la1: 1263 > l0: 1263 上記になっているということはループ処理はちゃんと実行されていますよね。 その後の処理で不具合が起きているのではないでしょうか? ※質問のコードは少しインデントがおかしい気がします。for e in range(len(l0)):の中にif __name__ == "__main__":があるところなど。コピペミスでしょうか?
shogaku

2020/12/10 06:37

実現したいこと・ソースコード・出力結果を追記致しました。 ソースコードのご指摘いただいた部分を修正し、実行したところ、出力結果のようになりました。 インデントなどについてほかにおかしいと思う部分などありましたら是非ご指摘いただきたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問