リアルタイムに変化する変数への代入値を記録する方法
You are now following this question
- You will see updates in your followed content feed.
- You may receive emails, depending on your communication preferences.
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Show older comments
3 votes
こんにちは。
以下のコードについて質問があります。
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を記録する方法はないでしょうか。 回答をよろしくお願いします。
Accepted Answer
michio
on 6 Nov 2016
3 votes
幾つか確認させてください。
- stats は イメージ領域のプロパティの計測を行う regionprops 関数の出力でしょうか。
- 「for文中の変数bcはリアルタイムに変化」とは、 for ループが進行する毎に bc が変化するという意味でしょうか。
- 「インクリメントの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 Comments
ZONZON
on 6 Nov 2016
回答していただきありがとうございます。 回答方法も勉強させていただきます。
- そうです。regionprops関数の出力で間違いありません。
- そうです。bcは1行2列の配列であり、それぞれのセルの数値はforループの進行とともにランダムに変化します。
- これは表現に誤りがありました。objectをコマンドラインに表示し、forループが進行する度に値が更新されるか見ていたのですが、ずっとobject=1のままであったという意味です。
このコードは以下のリンク先で公開されているコードの一部分です。
全てを載せるのはライセンス上問題があるかもしれないと思い、断片的にコードを掲載しました。 そのため、質問が分かりにくくなってしまっています。申し訳ありません。
michio
on 6 Nov 2016
細かい点をお願いし申し訳ございません。コメントありがとうございました。
stats(object).Centroid の値だけをまとめて1つの変数にする場合は、上述の通り for ループ内で事前確保した変数に bc(:,object) という形で代入していくか、
allbc = vertcat(stats.Centroid);
の実行が簡単かと思います。
「objectをコマンドラインに表示し、forループが進行する度に値が更新されるか見ていたのですが、ずっとobject=1のままであったという意味です。」
に関しては、ループ変数 object が何か他の用途に使用されている可能性が考えられますが、、ループの中に object 変数に値が代入されるコマンドの有無を確認して頂けますでしょうか。
コメントいただきありがとうございます。
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
on 9 Nov 2016
while ループ内で、_allbc_ が毎回上書きされているので、結果的には while ループの最後で処理される画像の Centroid のみが allbc に残ります。
while ループで処理される画像すべてに対して allbc を確保されたいということでしょうか?
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
on 9 Nov 2016
回答ありがとうございます。 おっしゃる通り、whileループ内で処理される画像すべてのallbcを記録したいということです。
cat関数を使うと配列を連結できるのですね。 適用してみようと思います。
フレーム毎にすなわちオブジェクトの数が異なるという状況理解いたしました。事前に処理するフレーム数がわかっていない場合でも
index = 1;
while(vid.FramesAcquired<=200)
%(中略)
allbc{index} = vertcat(stats.Centroid);
index = index + 1;
% (中略)
end
ですべてのフレームからの Centroid 情報をセル配列 allbc として確保は可能ですので、試してみてください。
ZONZON
on 10 Nov 2016
回答ありがとうございます。
上記を実行したところ、無事にallbcを記録できました。
ありがとうございました。
michio
on 10 Nov 2016
問題の把握に手間取りごめんなさい。ご希望どおりで良かったです。
またわからない点がありましたらご質問ください!
More Answers (0)
Categories
Find more on Programming in Help Center and File Exchange
Products
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)