在将OpenCV4Android导入到Android项目之后,可以使用JavaCameraView控件调用相机,但是显示预览时,可能出现图像旋转了90度的情况。

在网上找到几种办法,都是修改OpenCV4Android中的CameraBridgeViewBase中的deliverAndDrawFrame方法,分别试了一下:

1、Android开发使用OpenCv中JavaCameraView预览图左旋90度问题

试用了,方法无效,不知道是不是我的其他配置的问题

2、参考了Rotate camera preview to Portrait Android OpenCV Camera的回复

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) {
            canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);
            // 修改预览旋转90问题
            // 能够通过旋转,正常显示预览,但是图像被缩放了
            //canvas.drawBitmap(mCacheBitmap, (canvas.getWidth() - mCacheBitmap.getWidth()) / 2, (canvas.getHeight() - mCacheBitmap.getHeight()) / 2, null);
            //Change to support portrait view
            Matrix matrix = new Matrix();
            matrix.preTranslate((canvas.getWidth() - mCacheBitmap.getWidth()) / 2, (canvas.getHeight() - mCacheBitmap.getHeight()) / 2);

            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
                matrix.postRotate(90f, (canvas.getWidth()) / 2, (canvas.getHeight()) / 2);
            canvas.drawBitmap(mCacheBitmap, matrix, new Paint());
            // 修改预览旋转90问题end

            if (mFpsMeter != null) {
                mFpsMeter.measure();
                mFpsMeter.draw(canvas, 20, 30);
            }
            getHolder().unlockCanvasAndPost(canvas);
        }
    }
}

修改后的效果就是图像没有全屏。

3、还是参考上面的回答

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) {
            canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);

            // 修改预览旋转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度问题end

            if (mFpsMeter != null) {
                mFpsMeter.measure();
                mFpsMeter.draw(canvas, 20, 30);
            }
            getHolder().unlockCanvasAndPost(canvas);
        }
    }
}

这样预览图片可以全屏,并且是正的了。



更多相关文章

  1. Android图形图像处理之Bitmap和BitmapFactory
  2. 如何在Log中模拟方法e
  3. fragment 状态保存时怎么执行一些需要在onResume、onPause方法里
  4. 同时兼容高低版本的setBackground跟setTextColor方法
  5. 使用android的加速度计移动图像
  6. 四极管:I2CTools编译方法
  7. 检查ArrayList是否只包含null值的方法。
  8. 不同Android版本设备正确获取屏幕分辨率的通用方法
  9. studio更新时候,不小心点了ignore,无法更新的解决方法

随机推荐

  1. Python在计算内存时应该注意的问题?
  2. 老大,咱们前端要不要招个妹子?
  3. 我的入职体验,高手如云,美女也如云!
  4. GUI实战|Python做一个文档图片提取软件
  5. 用Python爬取b站弹幕,看大家还会接受《爱
  6. 动态加密?看我如何见招拆招爬取某点评全站
  7. 收藏这些API,获取网易云音乐数据超轻松
  8. Fabric 源码学习:如何实现批量管理远程服
  9. 只要两步,用Python将地址标记在地图上!
  10. Ansible 之 通过yum模块安装软件