2015-06-10 2 views
3

Я пытаюсь реализовать обнаружение лица в предварительном просмотре камеры. Я следил за страницами ссылок на 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), и он тоже не делает этого. Я чувствую, что какая-то функция должна применяться к точкам, но я не знаю, как это сделать.

Любые идеи о том, как исправить это?

+0

Девять привет! Я видел ваш вопрос, и насколько я понимаю, вы обнаружили обнаружение лица (Camera 2 API). Я новичок в Android и пытаюсь распознать лицо в течение 3 недель, но безуспешно ... Не могли бы вы рассказать мне, в какой части кода вы реализуете распознавание лиц ... это будет очень полезно для меня. Спасибо –

+0

@Aleksey, посмотрите выше на метод «onCaptureCompleted» – NineToeNerd

ответ

2

Для дальнейшего использования, это решения, которое я закончил с:

установить переменный класс/активность под названием orientation_offset:

orientation_offset = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); 

Это угол, вид датчика камеры (или прямоугольник распознавание лица) необходимо поворачивать для правильного просмотра.

Затем я изменил onSurfaceTextureUpdated():

Canvas currentCanvas = rectangleView.getHolder().lockCanvas(); 
    if (currentCanvas != null) { 

     currentCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 

     if (detectedFace != null && rectangleFace.height() > 0) { 

      int canvasWidth = currentCanvas.getWidth(); 
      int canvasHeight = currentCanvas.getHeight(); 
      int faceWidthOffset = rectangleFace.width()/8; 
      int faceHeightOffset = rectangleFace.height()/8; 

      currentCanvas.save(); 
      currentCanvas.rotate(360 - orientation_offset, canvasWidth/2, 
       canvasHeight/2); 

      int l = rectangleFace.right; 
      int t = rectangleFace.bottom; 
      int r = rectangleFace.left; 
      int b = rectangleFace.top; 
      int left = (canvasWidth - (canvasWidth*l)/cameraWidth)-(faceWidthOffset); 
      int top = (canvasHeight*t)/cameraHeight - (faceHeightOffset); 
      int right = (canvasWidth - (canvasWidth*r)/cameraWidth) + (faceWidthOffset); 
      int bottom = (canvasHeight*b)/cameraHeight + (faceHeightOffset); 

      currentCanvas.drawRect(left, top, right, bottom, purplePaint); 
      currentCanvas.restore(); 
     } 
    } 
    rectangleView.getHolder().unlockCanvasAndPost(currentCanvas); 

Я оставляю вопрос открытым в случае, если кто-то еще имеет решение предложить.

Смежные вопросы