x軸上で、ある点が原​点よりどちらにあるの​かを検出するプログラ​ム

조회 수: 1 (최근 30일)
tsuyoshi tsunoda
tsuyoshi tsunoda 2021년 7월 30일
댓글: tsuyoshi tsunoda 2021년 7월 30일
以前、「顔の切り抜いた部分の重心を求めてその点を結んだ三角形の面積を求めたい」という質問をしてやりたい事が出来るようになったのですが、そこから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;

채택된 답변

Atsushi Ueno
Atsushi Ueno 2021년 7월 30일
편집: Atsushi Ueno 2021년 7월 30일
もし、三角形の重心が口の重心(原点)よりも右にあったら「左向き」というテキスト、左にあったら「右向き」といったテキストも出せるようになりたいです
単純に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
Atsushi Ueno
Atsushi Ueno 2021년 7월 30일
편집: Atsushi Ueno 2021년 7월 30일
下記プログラムには連結要素の内「口」を特定する方法がありません。顔全体が回転しても「右向き」か「左向き」か判断するには、上記方法では駄目で連結要素が目ではなく口である事を判断する必要があります。
tsuyoshi tsunoda
tsuyoshi tsunoda 2021년 7월 30일
教えていただきありがとうございます。今やろうとしている事が理解できたので勉強して改良していこうと思います。

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 整数論에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!