ライブカメラのプレビューで顔を検出し、Googleが提供するplay-services-visionライブラリを使用してランドマークにいくつかのGIFを描画するコードがあります。play-services-vision:顔検出速度とカメラプレビュー速度をどのように同期させますか?
顔が静的である場合は十分に機能しますが、顔が適度な速度で動く場合、顔検出器は顔の新しい位置のランドマークを検出するためにカメラのフレームレートよりも時間がかかります。私はそれがビットマップ描画速度と関係があるかもしれないことを知っていますが、私はそれらの遅れを最小限に抑えるために措置を講じました。
(基本的に私はGIFを 『十分になめらかな再配置ではない』という苦情を取得)
編集:私は座標検出コードを取得しようとしなかった...
List<Landmark> landmarksList = face.getLandmarks();
for(int i = 0; i < landmarksList.size(); i++)
{
Landmark current = landmarksList.get(i);
//canvas.drawCircle(translateX(current.getPosition().x), translateY(current.getPosition().y), FACE_POSITION_RADIUS, mFacePositionPaint);
//canvas.drawCircle(current.getPosition().x, current.getPosition().y, FACE_POSITION_RADIUS, mFacePositionPaint);
if(current.getType() == Landmark.LEFT_EYE)
{
//Log.i("current_landmark", "l_eye");
leftEyeX = translateX(current.getPosition().x);
leftEyeY = translateY(current.getPosition().y);
}
if(current.getType() == Landmark.RIGHT_EYE)
{
//Log.i("current_landmark", "r_eye");
rightEyeX = translateX(current.getPosition().x);
rightEyeY = translateY(current.getPosition().y);
}
if(current.getType() == Landmark.NOSE_BASE)
{
//Log.i("current_landmark", "n_base");
noseBaseY = translateY(current.getPosition().y);
noseBaseX = translateX(current.getPosition().x);
}
if(current.getType() == Landmark.BOTTOM_MOUTH) {
botMouthY = translateY(current.getPosition().y);
botMouthX = translateX(current.getPosition().x);
//Log.i("current_landmark", "b_mouth "+translateX(current.getPosition().x)+" "+translateY(current.getPosition().y));
}
if(current.getType() == Landmark.LEFT_MOUTH) {
leftMouthY = translateY(current.getPosition().y);
leftMouthX = translateX(current.getPosition().x);
//Log.i("current_landmark", "l_mouth "+translateX(current.getPosition().x)+" "+translateY(current.getPosition().y));
}
if(current.getType() == Landmark.RIGHT_MOUTH) {
rightMouthY = translateY(current.getPosition().y);
rightMouthX = translateX(current.getPosition().x);
//Log.i("current_landmark", "l_mouth "+translateX(current.getPosition().x)+" "+translateY(current.getPosition().y));
}
}
eyeDistance = (float)Math.sqrt(Math.pow((double) Math.abs(rightEyeX - leftEyeX), 2) + Math.pow(Math.abs(rightEyeY - leftEyeY), 2));
eyeCenterX = (rightEyeX + leftEyeX)/2;
eyeCenterY = (rightEyeY + leftEyeY)/2;
noseToMouthDist = (float)Math.sqrt(Math.pow((double)Math.abs(leftMouthX - noseBaseX), 2) + Math.pow(Math.abs(leftMouthY - noseBaseY), 2));
...でView描画メソッド内の別のスレッドですが、SIGSEGVエラーが表示されます。
私の質問は:
- は、カメラのプレビューフレームレート、この場合に行うには正しいもので、顔検出器の処理速度を同期されるか、あるいはそれが他の方法で回避され、またはそれはいくつかの他の方法は何ですか?
- カメラのプレビューフレームで顔検出器が顔を検出すると、FDが終了する前にプレビューが供給するフレームをドロップする必要がありますか?もしそうなら、どうしたらいいですか?
- カメラのプレビューで
setClassificationMode(NO_CLASSIFICATIONS)
とsetTrackingEnabled(false)
を使用するだけで、検出が高速になるはずですか? - play-services-visionライブラリはOpenCVを使用していますが、どちらが実際に優れていますか?
EDIT 2:
私は1本の研究論文を読んでOpenCVの顔検出と高速アンドロイドであり、それらのより高い処理能力にOpenCVのに利用可能な他の機能を使用しています、。私はそれを利用して顔検出を早めることができるかどうか疑問に思っていました。
この問題でお手伝いできますか? https://stackoverflow.com/questions/45141098/google-vision-drawing-mask-on-face-with-animations –