Как преобразовать координаты сенсорного экрана Android в координаты датчика - PullRequest
0 голосов
/ 24 мая 2019

Чтобы реализовать касание для фокусировки на API-интерфейсе Android-камеры 2, необходимо преобразовать координаты касания на экране в координаты датчика камеры, которые согласно этому ответу не совпадают. Я хочу реализовать сенсорный фокус для камеры 2 api, для которой координаты касания должны быть масштабированы в соответствии с размером активной матрицы датчика камеры

Я уже пробовал эту суть , но вычисление прямоугольника измерения не имеет смысла для меня, и фокус также не работает. Это приводит к отрицательному значению для левого, верхнего, правого и нижнего прямоугольника, в зависимости от того, где кто-то касается экрана. Я также попробовал это и получил ту же вышеупомянутую проблему.

Я слежу за camera2basic кодом Android.

Это код, который, как я думал, будет работать, но он не фокусируется на месте касания экрана:


    mTextureView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if(event.getAction() == MotionEvent.ACTION_DOWN){
                        Rect sensor_array_size =characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
                        focusCameraOnArea(
                           (int)(sensor_array_size.width()*(event.getX()-event.getTouchMajor())/mTexturePreview.getWidth()),
                           (int)(sensor_array_size.height()*(event.getY()-event.getTouchMinor())/mTexturePreview.getHeight()),
                           (int)(event.getX()+event.getTouchMajor()),
                           (int)(event.getY()+event.getTouchMinor());
                    }
                    return true;

                }
            });
    private void focusCameraOnArea(int x, int y, int width, int height){
        MeteringRectangle focusArea = new MeteringRectangle(x, y, width, height);
        CameraCaptureSession.CaptureCallback focusCaptureCallback = new CameraCaptureSession.CaptureCallback() {
                    @Override
                    public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
                        super.onCaptureCompleted(session, request, result);
                        if(request.getTag()=="FOCUS_TAG"){
                            try{ 
                              mPreviewRequestBuilder.set(
                                    CaptureRequest.CONTROL_AF_TRIGGER,null);
                              mCaptureSession.setRepeatingRequest(
                                 mPreviewRequestBuilder.build(),null,null);}
                            catch(CameraAccessException e){
                                 e.printStackTrace();}
                                               }
                        }

                    @Override
                    public void onCaptureFailed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureFailure failure) {
                        super.onCaptureFailed(session, request, failure);
                        Log.wtf(TAG, "Manual AF failure: " + failure);

                    }
                };
                mCaptureSession.stopRepeating();

                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
                mCaptureSession.capture(mPreviewRequestBuilder.build(),focusCaptureCallback,mBackgroundHandler);

                if(characteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AF) >= 1){
                    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{focusArea});
                    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, new MeteringRectangle[]{focusArea});
                }
                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_MODE,CaptureRequest.CONTROL_MODE_AUTO);
                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_AUTO);
                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,CaptureRequest.CONTROL_AF_TRIGGER_START);
                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON);
                mPreviewRequestBuilder.setTag("FOCUS_TAG");

                mCaptureSession.capture(mPreviewRequestBuilder.build(),focusCaptureCallback,mBackgroundHandler);
            }catch(CameraAccessException e){e.printStackTrace();}
            catch (Exception e){e.printStackTrace();}            
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...