x軸上で、ある点が原点よりどちらにあるのかを検出するプログラム
1 view (last 30 days)
Show older comments
tsuyoshi tsunoda
on 30 Jul 2021
Commented: tsuyoshi tsunoda
on 30 Jul 2021
以前、「顔の切り抜いた部分の重心を求めてその点を結んだ三角形の面積を求めたい」という質問をしてやりたい事が出来るようになったのですが、そこからx軸上で口の重心を原点として、三角形の重心が口の重心(原点)と比較してどちらにあるかというプログラムを作りたいです。
もし、三角形の重心が口の重心(原点)よりも右にあったら「左向き」というテキスト、左にあったら「右向き」といったテキストも出せるようになりたいです。
ご教授願います。
%% Photoshop画像読込
Icolor = imread('/Users/tyt/Desktop/MATLAB/マネキン写真/右中心.png');
I = rgb2gray(Icolor); % グレースケール化
bgc = I(10,10); % 背景色の選択
%% 目と口の重心を求める
BW = I > bgc + 1 | I < bgc - 1; % (ほぼ)背景と背景以外で2値化(imbinarize)
s = regionprops(BW,'centroid'); % イメージ内の連結要素の重心を計算
Areas = regionprops(BW,'Area'); % 各重心位置計算されたエリアの面積
centroids = cat(1,s.Centroid); % 重心を格納する構造体配列を単一の行列に連結
centroids = centroids(cat(1,Areas.Area) > 10, :); % 面積の大きな連結要素のみ選択
%% 目と口の重心点を結んだ三角形の重心を求める
triangle = polyshape(centroids(:,1),centroids(:,2)); % 重心点を結んだ三角形を定義
[trcntx,trcnty] = centroid(triangle); % 三角形の重心
%% グラフィック表示
imshow(Icolor);
hold on;
plot(triangle);
plot(trcntx,trcnty,'*','Color','k');
hold off;
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/698492/image.png)
0 Comments
Accepted Answer
Atsushi Ueno
on 30 Jul 2021
Edited: Atsushi Ueno
on 30 Jul 2021
>もし、三角形の重心が口の重心(原点)よりも右にあったら「左向き」というテキスト、左にあったら「右向き」といったテキストも出せるようになりたいです
単純に3つあると断定している連結要素のx座標をソートして、真ん中のx座標と三角形の重心点を比較しています。変更したところ以降を下記に表示します。
sorted = sort(centroids(:,1)); % 目と口の重心点(x座標)をソート
%% グラフィック表示
imshow(Icolor);
hold on;
plot(triangle);
plot(trcntx,trcnty,'*','Color','k');
if sorted(2) - trcntx < 0 %(口の重心点)-(三角形の重心点)<0 なら右向きと表示
text(trcntx-40,trcnty+30,'右向き');
else
text(trcntx-40,trcnty+30,'左向き');
end
hold off;
2 Comments
Atsushi Ueno
on 30 Jul 2021
Edited: Atsushi Ueno
on 30 Jul 2021
下記プログラムには連結要素の内「口」を特定する方法がありません。顔全体が回転しても「右向き」か「左向き」か判断するには、上記方法では駄目で連結要素が目ではなく口である事を判断する必要があります。
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!