Я пытаюсь реализовать обнаружение лица в предварительном просмотре камеры. Я следил за страницами ссылок на Android, чтобы реализовать предварительный просмотр камеры в TextureView
, помещенный в FrameLayout
. Также в этом FrameLayout
находится SurfaceView
с четким фоном (перекрытие предварительного просмотра камеры). Мое приложение рисует Rect
, который автоматически распознается на грани CaptureResult.STATISTICS_FACES
лицом к холсту SurfaceView
при каждом обновлении предварительного просмотра камеры (один раз за кадр). Мое приложение предполагает, что нужно распознать только одно лицо.Android camera2.params.face прямоугольник размещения на холсте
Моя проблема возникает, когда я рисую прямоугольник. Я получаю прямоугольник в правильном месте, если я держу свое лицо в центре обзора камеры, но когда я двигаю головой вверх, прямоугольник перемещается вправо, и когда я перемещаю голову вправо, прямоугольник движется вниз. Как будто холст нужно повернуть на -90, но это не работает для меня (поясняется ниже кода).
в моей деятельности onCreate()
-х:
//face recognition
rectangleView = (SurfaceView) findViewById(R.id.rectangleView);
rectangleView.setZOrderOnTop(true);
rectangleView.getHolder().setFormat(
PixelFormat.TRANSPARENT); //remove black background from view
purplePaint = new Paint();
purplePaint.setColor(Color.rgb(175,0,255));
purplePaint.setStyle(Paint.Style.STROKE);
в TextureView.SurfaceTextureListener.onSurfaceTextureAvailable()
(в try{}
блоке, который инкапсулирует camera.open()
:
Rect cameraBounds = cameraCharacteristics.get(
CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
cameraWidth = cameraBounds.right;
cameraHeight = cameraBounds.bottom;
в том же слушателем в onSurfaceTextureUpdated()
:
if (detectedFace != null && rectangleFace.height() > 0) {
Canvas currentCanvas = rectangleView.getHolder().lockCanvas();
if (currentCanvas != null) {
currentCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
int canvasWidth = currentCanvas.getWidth();
int canvasHeight = currentCanvas.getHeight();
int l = rectangleFace.right;
int t = rectangleFace.bottom;
int r = rectangleFace.left;
int b = rectangleFace.top;
int left = (canvasWidth*l)/cameraWidth;
int top = (canvasHeight*t)/cameraHeight;
int right = (canvasWidth*r)/cameraWidth;
int bottom = (canvasHeight*b)/cameraHeight;
currentCanvas.drawRect(left, top, right, bottom, purplePaint);
}
rectangleView.getHolder().unlockCanvasAndPost(currentCanvas);
}
метод onCaptureCompleted
в CameraCaptureSession.CameraCallback
называют CameraCaptureSession.setRepeatingRequest()
петлителя:
//May need better face recognition sdk or api
Face[] faces = result.get(CaptureResult.STATISTICS_FACES);
if (faces.length > 0)
{
detectedFace = faces[0];
rectangleFace = detectedFace.getBounds();
}
Все переменные экземпляра за пределами функций.
В случае, если вы не можете вполне понять мой вопрос или нужна дополнительная информация, аналогичный вопрос размещен здесь:
How can i handle the rotation issue with Preview & FaceDetection
Однако, в отличие от выше плаката, я не мог даже получить мой холст, чтобы показать прямоугольник после поворота моего холста, так что это не может быть решением.
Я попытался повернуть мои точки на -90 градусов, используя x = -y, y = x (left = -top, top = left), и он тоже не делает этого. Я чувствую, что какая-то функция должна применяться к точкам, но я не знаю, как это сделать.
Любые идеи о том, как исправить это?
Девять привет! Я видел ваш вопрос, и насколько я понимаю, вы обнаружили обнаружение лица (Camera 2 API). Я новичок в Android и пытаюсь распознать лицо в течение 3 недель, но безуспешно ... Не могли бы вы рассказать мне, в какой части кода вы реализуете распознавание лиц ... это будет очень полезно для меня. Спасибо –
@Aleksey, посмотрите выше на метод «onCaptureCompleted» – NineToeNerd