リアルタイムに変化す​る変数への代入値を記​録する方法

こんにちは。
以下のコードについて質問があります。
for object = 1:length(stats)
bb = stats(object).BoundingBox;
bc = stats(object).Centroid;
plot(bc(1),bc(2), '-m+')
a=text(bc(1)+15,bc(2), strcat('X: ', num2str(round(bc(1))), ' Y: ', num2str(round(bc(2)))));
set(a, 'FontName', 'Arial', 'FontWeight', 'bold', 'FontSize', 14, 'Color', 'white');
end
ある条件下ではこのfor文が実行され、このfor文中の変数bcはリアルタイムに変化します。 この変化するbcの数値をすべて記録したいのですが、よい記述方法が思いつきません。 インクリメントのobjectは、必ずしも1ずつ増加するという動作を実行しておらず、 そのことが処理を難しくしています。
なんとかこのbcを記録する方法はないでしょうか。 回答をよろしくお願いします。

 採用された回答

michio
michio 2016 年 11 月 6 日

3 投票

幾つか確認させてください。
  1. stats は イメージ領域のプロパティの計測を行う regionprops 関数の出力でしょうか。
  2. 「for文中の変数bcはリアルタイムに変化」とは、 for ループが進行する毎に bc が変化するという意味でしょうか。
  3. 「インクリメントのobjectは、必ずしも1ずつ増加するという動作を実行しておらず」とのことですが、for object = 1:length(stats) という for ループのなかでは、 object は 1ずつ増加します。何か他のことに触れていらっしゃいますでしょうか?
例えば、すべての object bc の値を確保するだけですと、下記の実行でも可能となります。
N = length(stats);
bc = zeros(2,N);
for object = 1:length(stats)
bc(:,object) = stats(object).Centroid;
end
allbc = vertcat(stats.Centroid);

8 件のコメント

ZONZON
ZONZON 2016 年 11 月 6 日
回答していただきありがとうございます。 回答方法も勉強させていただきます。
  1. そうです。regionprops関数の出力で間違いありません。
  2. そうです。bcは1行2列の配列であり、それぞれのセルの数値はforループの進行とともにランダムに変化します。
  3. これは表現に誤りがありました。objectをコマンドラインに表示し、forループが進行する度に値が更新されるか見ていたのですが、ずっとobject=1のままであったという意味です。
このコードは以下のリンク先で公開されているコードの一部分です。
全てを載せるのはライセンス上問題があるかもしれないと思い、断片的にコードを掲載しました。 そのため、質問が分かりにくくなってしまっています。申し訳ありません。
michio
michio 2016 年 11 月 6 日
細かい点をお願いし申し訳ございません。コメントありがとうございました。
stats(object).Centroid の値だけをまとめて1つの変数にする場合は、上述の通り for ループ内で事前確保した変数に bc(:,object) という形で代入していくか、
allbc = vertcat(stats.Centroid);
の実行が簡単かと思います。
「objectをコマンドラインに表示し、forループが進行する度に値が更新されるか見ていたのですが、ずっとobject=1のままであったという意味です。」
に関しては、ループ変数 object が何か他の用途に使用されている可能性が考えられますが、、ループの中に object 変数に値が代入されるコマンドの有無を確認して頂けますでしょうか。
ZONZON
ZONZON 2016 年 11 月 9 日
編集済み: ZONZON 2016 年 11 月 9 日
コメントいただきありがとうございます。
allbc = vertcat(stats.Centroid);
を実行してみたところ、ループの最後の値のみ格納されてしまい、すべての値を記録することはできませんでした。先述したforループはwhile文内で実行されているため、それが影響を与えているのでしょうか...
while文のブロックをすべて記載しますので、ご覧いただき、アドバイスを頂けないでしょうか。 よろしくお願いします。
while(vid.FramesAcquired<=200)
data = getsnapshot(vid);
diff_im = imsubtract(data(:,:,1), rgb2gray(data));
diff_im = medfilt2(diff_im, [3 3]);
diff_im = im2bw(diff_im,0.18);
diff_im = bwareaopen(diff_im,300);
bw = bwlabel(diff_im, 8);
stats = regionprops(bw, 'BoundingBox', 'Centroid');
imshow(data)
hold on
allbc = vertcat(stats.Centroid);%for文内とここにこの記述を入れましたが、結果に変化はありませんでした。
for object = 1:length(stats)
toc
bb = stats(object).BoundingBox;
bc = stats(object).Centroid;
plot(bc(1),bc(2), '-m+')
a=text(bc(1)+15,bc(2), strcat('X: ', num2str(round(bc(1))), ' Y: ', num2str(round(bc(2)))));
set(a, 'FontName', 'Arial', 'FontWeight', 'bold', 'FontSize', 16, 'Color', 'white');
end
hold off
end
michio
michio 2016 年 11 月 9 日
while ループ内で、_allbc_ が毎回上書きされているので、結果的には while ループの最後で処理される画像の Centroid のみが allbc に残ります。
while ループで処理される画像すべてに対して allbc を確保されたいということでしょうか?
参考まで、 regionprops 関数のドキュメンテーションページの例ですが、こちらでは cat 関数を使って Centroid を1つの行列にまとめています。
BW = imread('text.png');
% regionprops を使用してイメージ内の連結要素の重心を計算します。
s = regionprops(BW,'centroid');
% 重心を格納する構造体配列を単一の行列に連結します。
centroids = cat(1, s.Centroid);
%重心の位置を重ね合わせたバイナリ イメージを表示します。
imshow(BW)
hold on
plot(centroids(:,1),centroids(:,2), 'b*')
hold off
ZONZON
ZONZON 2016 年 11 月 9 日
回答ありがとうございます。 おっしゃる通り、whileループ内で処理される画像すべてのallbcを記録したいということです。
cat関数を使うと配列を連結できるのですね。 適用してみようと思います。
michio
michio 2016 年 11 月 9 日
編集済み: michio 2016 年 11 月 9 日
フレーム毎にすなわちオブジェクトの数が異なるという状況理解いたしました。事前に処理するフレーム数がわかっていない場合でも
index = 1;
while(vid.FramesAcquired<=200)
%(中略)
allbc{index} = vertcat(stats.Centroid);
index = index + 1;
% (中略)
end
ですべてのフレームからの Centroid 情報をセル配列 allbc として確保は可能ですので、試してみてください。
ZONZON
ZONZON 2016 年 11 月 10 日
回答ありがとうございます。
上記を実行したところ、無事にallbcを記録できました。
ありがとうございました。
michio
michio 2016 年 11 月 10 日
問題の把握に手間取りごめんなさい。ご希望どおりで良かったです。
またわからない点がありましたらご質問ください!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeProgramming についてさらに検索

質問済み:

2016 年 11 月 6 日

コメント済み:

2016 年 11 月 10 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by