使用 opencv 使用 android 肖像模式时的问题
Posted
技术标签:
【中文标题】使用 opencv 使用 android 肖像模式时的问题【英文标题】:issues in working with android portrait mode with opencv 【发布时间】:2015-01-07 06:47:14 【问题描述】:我知道这是最重复的问题之一,但是,在付出了这么多努力之后,在任何地方都没有找到可行的解决方案。
这确实是一个致命的问题,尽管对于专家来说可能是一个简单的问题。
我正在研究 opencv Haar Cascade 分类器。(例如:人脸检测、眼睛对检测)
我刚刚从 "OpenCV-2.4.9-android-sdk" - 示例中获取了人脸检测示例代码。
此示例代码设置为横向模式,一切正常正常。
但是,我想让分类器在 portrait 模式下工作。我知道 haar 分类器不适用于纵向模式。
由于 opencv 使用“CameraBridgeViewBase”,我没有所有控件来使用相机的分辨率并显示 图像回到屏幕上。(预览)
现在,当我将屏幕方向设置为 "android:screenOrientation="portrait" 时,图像会以 90 度时钟 的方式旋转。
我尝试了什么:
要在不旋转的情况下预览人像图像:我通过添加修改“CameraBridgeViewBase”中的“deliverAndDrawFrame”
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, null);
让分类器在纵向模式下工作: 我使用 transpose 和 flip 的各种排列和组合来旋转我传递给“onCameraFrame”中的多尺度检测的灰度图像。
我的问题是什么?
我无法获得比我在“onCameraFrame”获得的原始分辨率更高的图像。 如何使图像的原始或实际或原生质量达到相机传感器的容量?
由于我已经为使分类器在纵向模式下工作而没有任何运气付出了很多努力,因此任何有效的建议/示例代码/参考都会对我有很大帮助。
【问题讨论】:
谁能帮帮我? 开发者不愿意帮助我们,对于如何解决这个问题存在大量相互矛盾的想法。 【参考方案1】:我找到了解决办法:
Matrix matrix = new Matrix();
matrix.preTranslate((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,(canvas.getHeight() - mCacheBitmap.getHeight()) / 2);
matrix.postRotate(90f,(canvas.getWidth()) / 2,(canvas.getHeight()) / 2);
float scale = (float) canvas.getWidth() / (float) mCacheBitmap.getHeight();
matrix.postScale(scale, scale, canvas.getWidth()/2 , canvas.getHeight()/2 );
canvas.drawBitmap(mCacheBitmap, matrix, new Paint());
这提供了具有正确比例的肖像模式:D 请尝试一下。我正在使用 OpenCV 3.4 。
【讨论】:
以上是关于使用 opencv 使用 android 肖像模式时的问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 RenderScript 旋转肖像模式的 YUV 图像数据