AndroidOpenCV摄像头预览旋转90度问题

本文详细介绍了如何解决在Android应用中使用OpenCV进行相机图像处理时遇到的旋转和显示问题,包括调整图像旋转角度以适配不同摄像头方向,以及解决因Bitmap尺寸不匹配导致的图像无法正常显示的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方案一:
将下图文件中的 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) {
                /*----------------------------修改预览旋转90度问题--------------------------------*/
                canvas.rotate(90,0,0);
                float scale= canvas.getWidth() / (float)mCacheBitmap.getHeight();
                float scale2= canvas.getHeight() / (float)mCacheBitmap.getWidth();
                if(scale2> scale)
                {
                    scale = scale2;
                }
                if (scale!= 0)
                {
                    canvas.scale(scale,scale,0,0);
                }
                canvas.drawBitmap(mCacheBitmap, 0, -mCacheBitmap.getHeight(), null);
                /*----------------------------修改预览旋转90度问题--------------------------------*/
                if (mFpsMeter != null) {
                    mFpsMeter.measure();
                    mFpsMeter.draw(canvas, 20, 30);
                }
                getHolder().unlockCanvasAndPost(canvas);
            }
        }
    }

方案二:

    @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
        Mat dst = inputFrame.rgba();
        //Log.e(TAG,"orientation : " + this.getRequestedOrientation());

        if(current_camera_idx == CameraBridgeViewBase.CAMERA_ID_BACK)
            Core.rotate(dst, dst, Core.ROTATE_90_CLOCKWISE);
        if(current_camera_idx == CameraBridgeViewBase.CAMERA_ID_FRONT)
        {
            Core.rotate(dst, dst, Core.ROTATE_90_COUNTERCLOCKWISE);
            Core.flip(dst, dst, 1);
        }
        process_image(dst);
        return dst;
    }

如上对于后置相机顺时针旋转90度,前置相机逆时针旋转90度,同时做镜像
这么更改后会出现没有图像的问题,logcat会有如下提示:

    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;
    }

原因是mCacheBitmap是之前创建的其长宽都和修改后的Mat对象不匹配,导致在Utils.matToBitmap的时候发生Crash,因此我们需要在转换之前,重新设定bitmap的长宽,如下:

    protected void deliverAndDrawFrame(CvCameraViewFrame frame) {
        Mat modified;
        if (mListener != null) {
            modified = mListener.onCameraFrame(frame);
        } else {
            modified = frame.rgba();
        }

+        if(mCacheBitmap != null) {
+            mCacheBitmap.recycle();
+            mCacheBitmap = Bitmap.createBitmap(modified.width(), modified.height(), Bitmap.Config.ARGB_8888);
+        }

        boolean bmpValid = true;
        if (modified != null) {

更改后图像就能正常的显示了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值