3 SDK API の使用
3.1 SDK ハンドルの初期化
1. HumanActionの初期化
//HumanAction ハンドルを初期化します
//モデルのパスを取得します
NSString *strModelPath = [[NSBundle mainBundle]
pathForResource:@"M_SenseME_Action" ofType:@"model"];
//HumanAction ハンドルを作成します
//注記: 本 SDK の API では、2 種類の HumanAction ハンドル作成方法を提供します。
//検知対象がビデオである場合は ST_MOBILE_HUMAN_ACTION_DEFAULT_CONFIG_CREATE
//に設定し、画像である場合は ST_MOBILE_HUMAN_ACTION_DEFAULT_CONFIG_IMAGE に
//設定します。詳細については、st_mobile_human_action.h ファイルをご参照ください。
//ハンドル作成用の config コマンドと、人間の動作を検知するための config コマンドを
//区別するように注意してください。動作を検知するための config コマンドは、config
//コマンドを使用してハンドルを作成できる場合にのみ有効になります。
iRet = st_mobile_human_action_create(
strModelPath.UTF8String,
ST_MOBILE_HUMAN_ACTION_DEFAULT_CONFIG_VIDEO,
&_hDetector
);
//他のモデルをロードして、st_mobile_human_action_add_sub_model を呼び出します
NSString *strEyeCenter = [[NSBundle mainBundle]
pathForResource:@"xx" ofType:@"model"];
iRet = st_mobile_human_action_add_sub_model(
_hDetector,
strEyeCenter.UTF8String
);
//アバタースタンプは、目の輪郭点モデルと専用のアバターモデル (avatar_core.model)
// を一緒に読み込む必要があることに注意してください
//モデルを削除します。必要に応じて、動的にモデルを追加、または削除できます。
//詳細についてはサンプルをご参照ください。
iRet = st_mobile_human_action_remove_model_by_config(
_hDetector,
ST_MOBILE_ENABLE_FACE_EXTRA_DETECT
);
//人間の動作用のパラメーターを設定します。2 フレームごとに 1 回ジェスチャを検知するよう
//に設定しています。必要に応じて設定できます。
//他のパラメーターに関しては、st_mobile_human_action.h ファイルをご参照ください。
iRet = st_mobile_human_action_setparam(
_hDetector,
ST_HUMAN_ACTION_PARAM_HAND_PROCESS_INTERVAL,
2
);
2. 顔属性APIハンドルの初期化
//顔属性ハンドルを初期化します
//顔属性モデルのパスを取得します
NSString *strAttriModelPath = [[NSBundle mainBundle]
pathForResource:@"face_attribute" ofType:@"model"];
//顔属性ハンドルを作成します
iRet = st_mobile_face_attribute_create(
strAttriModelPath.UTF8String,
&_hAttribute
);
3.2 フレーム処理フロー
1. HumanAction APIの使用
//cofig コマンドで設定された顔、顔の動き、表情、ジェスチャ、前景と背景のセグメンテーション、体、および体の動きの特徴点を検知します。
//config コマンドを利用可能な場合にのみ、データが検知結果に表示されます。
//検知結果の構造は、st_mobile_human_action.h ファイルで定義されています。詳細に関しては、サンプルをご参照ください。
iRet = st_mobile_human_action_detect(_hDetector,//顔検知ハンドル
pBGRAImageIn,//出力データのアドレス
ST_PIX_FMT_BGRA8888,//画像形式
iWidth,//幅
iHeight,//高さ
iBytesPerRow,//iWidth * 4 (BGRA の 4 チャンネル)
stMobileRotate,//回転角度
iConfig,//動きの検知
&detectResult//検知結果
);
回転角度:写真を撮影した携帯電話に対して画像を回転させ、顔を検知できる方向を確認します。これが顔を検知する際の角度です。詳細については、enumパラメータを参照してください。
typedef enum {
ST_CLOCKWISE_ROTATE_0 = 0, ///< 正面からの顔認証を維持するために、画像を回転させる必要はありません。
ST_CLOCKWISE_ROTATE_90 = 1, ///< 正面からの顔認証を維持するために、画像を 90 度回転する必要があります。
ST_CLOCKWISE_ROTATE_180 = 2,///< 正面からの顔認証を維持するために、画像を 180 度回転する必要があります。
ST_CLOCKWISE_ROTATE_270 = 3 ///< 正面からの顔認証を維持するために、画像を 270 度回転する必要があります。
} st_rotate_type;
2. 表情 API の使用
表情に関するAPIは、動作検知の関数の結果を必要とします。したがって、次のように動作検知の関数の後に呼び出されます。
//表情の検知結果。各要素により示される表情は、ST_MOBILE_EXPRESSION 関数の列挙で定義されます。
bool expressionResult[128] = {0};
st_result_t iRet = st_mobile_get_expression(&detectResult, stMobileRotate, NO, expressionResult);
//表情のしきい値を設定します。デフォルトのしきい値を推奨します。手動で設定する必要はありません。
iRet = st_mobile_set_expression_threshold(ST_MOBILE_EXPRESSION_HEAD_NORMAL, 0.5);
3. 顔属性 API の使用
FaceAttribute API
は、HumanAction
パラメータから入力します。したがって、顔属性APIの実行前に、HumanAction
パラメータを設定する必要があります。
iRet = st_mobile_face_attribute_detect(_hAttribute,
pBGRAImageIn,
ST_PIX_FMT_BGRA8888,
iWidth,
iHeight,
iBytesPerRow,
_pFacesDetection,
1, //デモ用に、最初に検知した 1 つの顔の属性を取得します。
&pAttrArray);
4. 美化 API の使用
目の拡大や顎の縮小などの美化APIの関数も、HumanAction
に由来します。
//テクスチャを美化します
iRet = st_mobile_beautify_process_texture(_hBeautify,
_textureOriginInput,
iWidth,
iHeight,
&detectResult,
_textureBeautifyOutput,
&processedResult);
detectResult
は人間の動作の検知結果用で、processedResult
は目の拡大や顎の縮小などの美化を行った後の顔特徴点用です。processResult
は、上位層で手動で割り当てられます。detectResult
と同じか、detectResult
から取り込まれたものです)。
美化パラメーターの設定:
//美化パラメーターを設定します
iRet = st_mobile_beautify_setparam(_hBeautify, ST_BEAUTIFY_REDDEN_STRENGTH, 0.36f);//赤みの強度、値の範囲: [0, 1.0]、赤みなしの場合は 0.0
//トラッキングする領域を一度だけ設定します。リセット後に、対象領域を再設定します。
st_result_t iRet =
st_mobile_object_tracker_set_target(
st_handle_t handle, //初期化された、一般的なオブジェクトのトラッキングハンドル
const unsigned char *image, //検知対象の画像
st_pixel_format pixel_format, //検知用画像データのピクセル形式。一律にグレースケール画像に変換されます。
int image_width, //検知用画像の幅 (ピクセル単位)
int image_height, //検知用画像の高さ (ピクセル単位)
int image_stride, //検知用画像のスパン (ピクセル単位)。各行のバイト数のこと。
st_rect_t* target_rect //指定されたターゲットの顔枠を入力します。現在は、2 ^ n の正方形のみトラッキングできます。
);
//リアルタイムで連続ビデオフレームのターゲットを高速トラッキングします
st_result_t iRet =
st_mobile_object_tracker_track(
st_handle_t handle, ////初期化された、一般的なオブジェクトのトラッキングハンドル
const unsigned char *image, //検知対象の画像データ
st_pixel_format pixel_format,//検知対象の画像データのピクセル形式
int image_width, //検知対象の画像の幅
int image_height, //検知対象の画像の高さ
int image_stride, //検知対象の画像スパン
st_rect_t *result_rect //トラッキングされた顔枠の新しい位置を出力
float *result_score //信頼係数。必要に応じて、トラッキンが失敗したかどうかを判断する場合は、値を (0, 1) に設定します。
);
//一般的なオブジェクトトラッキング API ハンドルをリセットします
st_mobile_object_tracker_reset(
st_handle_t handle //一般的なオブジェクトトラッキングハンドル
);
3.3 SDK ハンドルの解放
1. GLリソースは、GLスレッドで解放する必要があります。
- (void)releaseResources
{
if ([EAGLContext currentContext] != self.glContext) {
[EAGLContext setCurrentContext:self.glContext];
}
//スタンプ API ハンドルを解放します
if (_hSticker) {
st_mobile_sticker_destroy(_hSticker);
_hSticker = NULL;
}
//美化 API ハンドルを解放します
if (_hBeautify) {
st_mobile_beautify_destroy(_hBeautify);
_hBeautify = NULL;
}
//顔検知ハンドルを解放します
if (_hDetector) {
st_mobile_human_action_destroy(_hDetector);
_hDetector = NULL;
}
//顔属性ハンドルを解放します
if (_hAttribute) {
st_mobile_face_attribute_destroy(_hAttribute);
_hAttribute = NULL;
}
//フィルターハンドルを解放します
if (_hFilter) {
st_mobile_gl_filter_destroy(_hFilter);
_hFilter = NULL;
}
//一般的なオブジェクトハンドルを解放します
if (_hTracker) {
st_mobile_object_tracker_destroy(_hTracker);
_hTracker = NULL;
}
//検知出力から顔配列を解放します
if (_pFacesDetection) {
free(_pFacesDetection);
_pFacesDetection = NULL;
}
//美化出力から顔配列を解放します
if (_pFacesBeautify) {
free(_pFacesBeautify);
_pFacesBeautify = NULL;
}
//テクスチャのリソースを解放します
[self releaseResultTexture];
//テクスチャのキャッシュを解放します
if (_cvTextureCache) {
CFRelease(_cvTextureCache);
_cvTextureCache = NULL;
}
[EAGLContext setCurrentContext:nil];
}
まとめ
第3章では、本SDKのAPIの使用方法に関する概要を説明しました。デモのプレゼンテーションは、SDKのより迅速な統合を促進します。
いくつかの考慮すべき点を以下に示します。
顔属性の検知、美化、スタンプを使用するには、事前にhumanActionを検知する必要があります。
美化、スタンプ、フィルターは、OpenGLによりレンダリングされます。そのため、同じ
EAGLContext
内にある必要があります。次のように実装します。
if ([EAGLContext currentContext] != self.glContext) {
[EAGLContext setCurrentContext:self.glContext];
}
Last updated