Android camera2.params.face矩形放置在canvas上
我正在尝试在相机预览中实现面部检测。 我按照Android参考页面在TextureView
实现自定义相机预览,放置在FrameLayout
。 此FrameLayout
中还有一个背景清晰的SurfaceView
(与相机预览重叠)。 每次更新相机预览时(每帧一次),我的应用程序会绘制第一个CaptureResult.STATISTICS_FACES
面部边界动态识别到SurfaceView
canvas的Rect
。 我的应用假设只需要识别一张脸。
我绘制矩形时会出现问题。 如果我将脸保持在摄像机视图的中心,我将矩形放在正确的位置,但当我向上移动头部时,矩形向右移动,当我向右移动头部时,矩形向下移动。 好像canvas需要旋转-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.setRepeatingRequest()
looper调用的onCaptureCompleted
中的onCaptureCompleted
方法:
//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(); }
所有变量都在函数之外实例化。
如果您不太了解我的问题或需要其他信息,请在此处发布类似的问题:
如何处理Preview&FaceDetection的旋转问题
然而,与上面的海报不同,我甚至无法让我的canvas在旋转canvas后显示矩形,因此这不是解决方案。
我尝试使用x = -y,y = x(left = -top,top = left)将我的点旋转-90度,并且它也没有做到这一点。 我觉得某些function需要应用于这些要点,但我不知道如何去做。
有想法该怎么解决这个吗?
为了将来参考,这是我最终得到的解决方案:
设置一个名为orientation_offset
的类/ Activity变量:
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);
如果其他人有解决方案,我会保留这个问题。
- 例外:android.view.InflateException:二进制XML文件行#20:错误膨胀类net.simonvt.datepicker.DatePicker
- Android:如何以编程方式登录网站并从中检索数据?
- Android 4.0 – > 4.3(包含) – Webview页面之间的Web存储丢失
- 尝试为PDFTron Android加载图书馆时出错
- Android- java.lang.IllegalArgumentException
- Android-Java RSA解密
- 如何在Android中通过POST请求查询Web服务?
- 如何基于按钮单击在新屏幕上打开webview中的URL
- SimpleXML无缘无故地抛出XmlPullParserException,未终止的实体ref