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

bd041bf5169f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

cover.jpg

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

android:name=".MainActivity"

android:screenOrientation="landescape"//横屏

android:configChanges="keyboardHidden|orientation"

android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen" />

这没什么问题,官方教程例子也是横屏的。

但是,当在界面上加上自己的按钮的时候,默认也是横屏排列的,如下:

bd041bf5169f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

1.jpg

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

android:screenOrientation="landescape"

修改为

android:screenOrientation=" portrait"

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

bd041bf5169f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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

}

}

}

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

bd041bf5169f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

3.jpg

如果点切换相机,前置摄像头画面也正常了。

此处没有截前置相机的画面(哈哈),切换相机的实验,见前文的说明。

这就暂时解决了相机旋转这个问题。但是,我并非百分百确定这个办法有效,因为后续我还想拿它做下OpenCV的其他识别,比如说,识别人脸,或者特定目标。会不会检测不到尚不可知。等我实验过后如果有异常,回来再更新。如果没更新,那说明还行:D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值