アドオン:Facial Landmarks において, 顔のランドマークの値を抽出する方法

10 views (last 30 days)
Akira Miyata
Akira Miyata on 11 Sep 2022
Commented: Atsushi Ueno on 13 Sep 2022
アドオン:Facial Landmarks(https://jp.mathworks.com/matlabcentral/fileexchange/47713-facial-landmarks)にて用意されている関数,「Test.m」を用いて顔画像からランドマークを検出することはできましたが,各特徴点(左右目・眉等のFacial Landmark)の座標の値を抽出する方法が分かりません.
目的としては,「予め抽出しておいた特徴点」と,ウェブカメラで入力された画像に対して「新たに検出された特徴点」の対応する座標同士を比較し,値がある範囲で近似した場合に,その画像を保存するプログラムの作成に必要になります.
アドオンのページでは解決できず,自己解決も難しいため,問題の解決策を教えて頂きたいです.どうぞよろしくお願いいたします.

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 12 Sep 2022
ランドマークの座標は既に計算されていますが、相対的な値が出力されています。目的は「元の入力画像上のランドマーク座標」と思いますが、元の画像上の座標まで戻すには、相対的に計算してきた座標を元に戻していかないとなりません。
  • 最初に元の人物画像のサイズを変更してから各処理を実施している
  • 顔領域の画像を保存しているが、顔領域の座標(x,y,w,h)を保存していない
  • 顔領域の座標は、入力元の人物画像を原点として計算している
  • 顔の各部位領域の座標は、顔領域を原点として計算している
  • ランドマークの座標は、各部位領域を原点として計算している
  • 各部位領域の画像を適宜拡大してから画像処理している
  • (ランドマークの座標を得る際に拡大した分を元に戻した座標を得ている)
% detectFacialRegions.m:下記の通り "Face" を追記する
function [Face, imgFace, LeftEye, RightEye, Mouth, LeftEyebrow, RightEyebrow] = detectFacialRegions(I)
% Test.m:27行目に下記の通り "Face" を追記する
[Face, imgFace, LeftEye, RightEye, Mouth, LeftEyebrow, RightEyebrow] = detectFacialRegions(I);
%% Test.m の最後に下記を追記する
close(gcf)
imshow('face.jpg'); hold on;
showsLandmarks(landLeftEye,leftEyeCont,LeftEye + Face,landconf);
showsLandmarks(landRightEye,rightEyeCont,RightEye + Face,landconf);
showsLandmarks(landMouth,MouthCont,Mouth + Face,landconf);
showsLandmarks(landLeftEyebrow,leftEyebrowCont,LeftEyebrow + Face,landconfEyebrow);
showsLandmarks(landRightEyebrow,RightEyebrowCont,RightEyebrow + Face,landconfEyebrow);
既にランドマーク座標はlandmarks関数により部位領域原点から顔領域原点に補正されたcoord****が作られていますが、これを利用せず元のland*****に部位領域+顔領域の座標を加算しています。これで896ピクセル四方から224ピクセル四方にリサイズされた画像に対するランドマークの座標が表示できます。なぜならland***とcoord***の形やサイズが異なる為、showsLandmarks関数にcoord***を入力し難かったからです。
次にランドマークの座標を元の896ピクセル四方の画像に戻すにはどうするか、ちょっと考えてみてください(もう寝る)
  2 Comments
Atsushi Ueno
Atsushi Ueno on 13 Sep 2022
次にランドマークの座標を元の896ピクセル四方の画像に戻すにはどうするか、ちょっと考えてみてください(もう寝る)⇒全部即値ですが、これで元の画像と同じサイズになります。
%% Test.m の最後に下記を追記する
close(gcf)
leftEyeCont(3) = leftEyeCont(3) * 896 / 224;
rightEyeCont(3) = rightEyeCont(3) * 896 / 224;
MouthCont(3) = MouthCont(3) * 896 / 224;
leftEyebrowCont(3) = leftEyebrowCont(3) * 896 / 224;
RightEyebrowCont(3) = RightEyebrowCont(3) * 896 / 224;
imshow('face.jpg'); hold on;
showsLandmarks(landLeftEye*896/224,leftEyeCont,(LeftEye + Face)*896/224,landconf);
showsLandmarks(landRightEye*896/224,rightEyeCont,(RightEye + Face)*896/224,landconf);
showsLandmarks(landMouth*896/224,MouthCont,(Mouth + Face)*896/224,landconf);
showsLandmarks(landLeftEyebrow*896/224,leftEyebrowCont,(LeftEyebrow + Face)*896/224,landconfEyebrow);
showsLandmarks(landRightEyebrow*896/224,RightEyebrowCont,(RightEyebrow + Face)*896/224,landconfEyebrow);

Sign in to comment.

More Answers (0)

Categories

Find more on Matrix Indexing in Help Center and File Exchange

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!