前提・実現したいこと
粒子群の移動の様子を撮影した動画を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
あなたの回答
tips
プレビュー