继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

OpenCV for Android(5):竖屏摄像头旋转问题

幕布斯6054654
关注TA
已关注
手记 1258
粉丝 219
获赞 1011

webp

cover.jpg

在开始加界面按钮的时候,发现一个别扭的问题,竖屏下摄像头会旋转90度。在之前的文章中,默认的布局形式是横屏的,可以看到在AndroidManifest.xml文件中,关于屏幕方向是这么写的:

<activity
    android:name=".MainActivity"
    android:screenOrientation="landescape"//横屏
    android:configChanges="keyboardHidden|orientation"
    android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen" />

这没什么问题,官方教程例子也是横屏的。
但是,当在界面上加上自己的按钮的时候,默认也是横屏排列的,如下:


webp

1.jpg

这样感觉不太对劲,即使手机竖过来,图标也还是不动的,而且平时的使用习惯也是竖着比较方便,于是我改了

android:screenOrientation="landescape"

修改为

android:screenOrientation=" portrait"

这下按钮位置对了,但是画面不对了,见下图:


webp

2.jpg

显示的画面不但没有全屏,而且方向还不对,看起来好像向左旋了90度。
这可能与我的小米手机有关,也可能与OpenCV图像获取有关。不过也不能确定,毕竟我没有在其他机型上测试过。但是我在网上搜到其他人也碰到过这个问题。经过各种尝试,最后终于搞清楚,这个跟android的图像采集原理有关,具体到OpenCV这里,需要改图像获取的模块,在SDK里面。

出现这个问题的原理在这里,参考了这个问题的回复。我试出来最可靠的做法是:

  • 修改CameraBridgeViewBase.cpp中的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) {
            canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);            if (BuildConfig.DEBUG)
                Log.d(TAG, "mStretch value: " + mScale);           // ===修改这里解决预览旋转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);
        }
    }
}

再运行试试,终于正常了:


webp

3.jpg

如果点切换相机,前置摄像头画面也正常了。
此处没有截前置相机的画面(哈哈),切换相机的实验,见前文的说明。



作者:晚晴风_
链接:https://www.jianshu.com/p/bd041bf5169f


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP