OpenCV + Android: проблема со снимком экрана с высоким разрешением CameraBridgeViewBase - PullRequest
0 голосов
/ 05 августа 2020

Я использую OpenCV 3.4.2 Я создаю простое приложение для обнаружения бумаги. Пока я пытаюсь захватить CameraBridgeViewBase.CvCameraViewFrame inputFrame преобразование матового изображения в растровое, я не могу достичь высокого разрешения. Мои снимки всегда дают мне разрешение 600x800. Я пробовал cameraBridgeViewBase.setMaxFrameSize(), не получилось. Я пытался написать свой собственный класс View, но не смог его реализовать. Может кто-нибудь помочь мне? Спасибо.

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    this.inputFrame = inputFrame.rgba();
    System.out.println(this.inputFrame.width()+"***"+this.inputFrame.height());
    globalMat=this.inputFrame.clone();
    if (startCanny) {
        quadrilateral=DetectPaper.findDocument(this.inputFrame);  //contour ve pointleri bulan fonksiyon
        if (quadrilateral!=null){
            //findocument hareketli bir görüntüden frame frame görüntüleri çekerken dörtgen bulamazsa nullPointer exception ile
            //karşılaşıyor o yüzden objeyi kontrol etmek gerekiyor
            //draw contour bulduğumuz contourları çiziyor
            //Imgproc.drawContours(this.inputFrame,quadrilateral.contour,1,new Scalar(0,255,0),3);
            //Her köşe için pointleri çizdiriyoruz
            for (int i=0;i<quadrilateral.points.length;i++){
                Imgproc.drawMarker(this.inputFrame,quadrilateral.points[i],new Scalar(255,0,0),Imgproc.MARKER_STAR,16);
            }
        }
    }

    return this.inputFrame;
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    cameraBridgeViewBase = (JavaCameraView)findViewById(R.id.my_camera);
    cameraBridgeViewBase.setVisibility(SurfaceView.VISIBLE);
    cameraBridgeViewBase.setCvCameraViewListener(this);

    cameraBridgeViewBase.enableFpsMeter();


    //System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    baseLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            super.onManagerConnected(status);

            switch(status){

                case BaseLoaderCallback.SUCCESS:
                    cameraBridgeViewBase.enableView();

                    break;
                default:
                    super.onManagerConnected(status);
                    break;
            }
        }
    };
    checkPermission();
}

public static Bitmap captureBitmap(){
    Core.flip(globalMat.t(),globalMat,1); // Dik ekrandayken Mat 90 derece sağa yatık olduğu için döndürüyoruz
    quadrilateral=DetectPaper.findDocument(globalMat); // FAB ve perspective için tekrar point noktalarını buluyoruz
  }
    //İleride bunu çizdirmek yerine butonların kordinatlarını belirlemek için kullanacağız
    Bitmap bitmap= Bitmap.createBitmap(globalMat.width(),globalMat.height(),Bitmap.Config.ARGB_8888);
    try {
        bitmap = Bitmap.createBitmap(globalMat.cols(), globalMat.rows(), Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(globalMat, bitmap);
    }catch(Exception ex){
        System.out.println(ex.getMessage());
    }
    return bitmap;
}

И здесь мой класс CameraBridgeViewBase меняется. Я меняю метод deliverAndDrawFrame() из-за полноэкранного режима.

protected void deliverAndDrawFrame(CvCameraViewFrame frame) {
    Mat modified;

    if (mListener != null) {
        modified = mListener.onCameraFrame(frame);
    } else {
        modified = frame.rgba();
    }

    boolean bmpValid = true;
    if (modified != null) {
        try {
            Utils.matToBitmap(modified, mCacheBitmap);
        } catch(Exception e) {
            Log.e(TAG, "Mat type: " + modified);
            Log.e(TAG, "Bitmap type: " + mCacheBitmap.getWidth() + "*" + mCacheBitmap.getHeight());
            Log.e(TAG, "Utils.matToBitmap() throws an exception: " + e.getMessage());
            bmpValid = false;
        }
    }

    if (bmpValid && mCacheBitmap != null) {
        Canvas canvas = getHolder().lockCanvas();
        if (canvas != null) {
            int saveCount = canvas.save();
            canvas.setMatrix(mMatrix);

            mScale = Math.max((float) canvas.getHeight() / mCacheBitmap.getWidth(), (float) canvas.getWidth() / mCacheBitmap.getHeight());


            canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);
            Log.d(TAG, "mStretch value: " + mScale);

            if (mScale != 0) {
                canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
                        new Rect((int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2),
                                (int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2),
                                (int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2 + mScale*mCacheBitmap.getWidth()),
                                (int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2 + mScale*mCacheBitmap.getHeight())), null);
            } else {
                canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
                        new Rect((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,
                                (canvas.getHeight() - mCacheBitmap.getHeight()) / 2,
                                (canvas.getWidth() - mCacheBitmap.getWidth()) / 2 + mCacheBitmap.getWidth(),
                                (canvas.getHeight() - mCacheBitmap.getHeight()) / 2 + mCacheBitmap.getHeight()), null);
            }
            canvas.restoreToCount(saveCount);

            if (mFpsMeter != null) {
                mFpsMeter.measure();
                mFpsMeter.draw(canvas, 20, 30);
            }
            getHolder().unlockCanvasAndPost(canvas);
        }
    }
}
@Override
public void layout(int l, int t, int r, int b) {
    super.layout(l, t, r, b);
    updateMatrix();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    updateMatrix();
}

private void updateMatrix() {
    float hw = this.getWidth() / 2.0f;
    float hh = this.getHeight() / 2.0f;
    boolean isFrontCamera = Camera.CameraInfo.CAMERA_FACING_FRONT == mCameraIndex;
    mMatrix.reset();
    if (isFrontCamera) {
        mMatrix.preScale(-1, 1, hw, hh);
    }
    mMatrix.preTranslate(hw, hh);
    if (isFrontCamera)
        mMatrix.preRotate(270);
    else
        mMatrix.preRotate(90);
    mMatrix.preTranslate(-hw, -hh);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...