【问题标题】:OpenCV Android - Elaborate Camera in Portrait ModeOpenCV Android - 人像模式下的精致相机
【发布时间】:2015-05-24 14:01:09
【问题描述】:

我刚刚从 OpenCv 开始,我现在使用 sdk for android 没有 c++ 标头。

我已将在 sdk 文件夹中找到的示例导入到我的 android studio,我已按照网上找到的一些提示使其工作。现在他们工作了,我已经试过了,但是所有的例子都有问题。 它们显示相机预览,或者更好的是从相机精心制作的框架然后显示在显示器上,向右翻转 90 度并且它们也被镜像。

这对我来说很奇怪,我无法使其正常工作,在网上阅读了很多提示,这是一个很常见的问题。

我尝试将setDisplayOrientation(90) 加入JavaCameraView 类,但它仅用于显示相机预览,如果我尝试在画布表面上书写,它会被锁定并出错,所以我无法再详细说明框架了。

我尝试将onCameraFrame 修改为我的主类,但如果我尝试使用core.flip 逐帧旋转相机,我将进入拉伸图像或黑屏。 最后这种方法由于是逐帧处理,使得相机的响应非常慢。

有人有这个问题吗?怎么可能解决? OpenCv 中是否有正确的相机方向的方法?

谢谢

【问题讨论】:

  • 您找到解决方案了吗?如果您有任何解决方案以纵向模式显示预览,请发布答案。
  • 暂时没有找到解决方案。

标签: android opencv camera rotation


【解决方案1】:

我知道现在回答这个问题为时已晚。但我终于找到了不会使相机帧变慢的解决方案。
您必须在默认的 opencv 类中进行更改。 请按照以下步骤操作:1)在 CameraBridgeViewBase 类中添加以下代码

Matrix matrix = new Matrix();
matrix.setRotate(90f);
Bitmap bitmap = Bitmap.createBitmap(mCacheBitmap, 0, 0, mCacheBitmap.getWidth(), mCacheBitmap.getHeight(), matrix, true);

2) 现在在 drawbitmap 方法中用 mCacheBitmap 替换上面的位图,如下所示

if (mScale != 0) {
            canvas.drawBitmap(bitmap, new Rect(0,0,bitmap.getWidth(), bitmap.getHeight()),
                    new Rect((int)((canvas.getWidth() - mScale*bitmap.getWidth()) / 2),
                            (int)((canvas.getHeight() - mScale*bitmap.getHeight()) / 2),
                            (int)((canvas.getWidth() - mScale*bitmap.getWidth()) / 2 + mScale*bitmap.getWidth()),
                            (int)((canvas.getHeight() - mScale*bitmap.getHeight()) / 2 + mScale*bitmap.getHeight())), null);
        } else {
 canvas.drawBitmap(bitmap, new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()),
                    new Rect((canvas.getWidth() - bitmap.getWidth()) / 2,
                            (canvas.getHeight() - bitmap.getHeight()) / 2,
                            (canvas.getWidth() - bitmap.getWidth()) / 2 + bitmap.getWidth(),
                            (canvas.getHeight() - bitmap.getHeight()) / 2 + bitmap.getHeight()), null);

}

3) 现在,在您的 JavaCameraView 类中替换 initializeCamera 方法中的以下代码(更改纵向模式的高度、宽度)

if ((getLayoutParams().width == ActionBar.LayoutParams.MATCH_PARENT) && (getLayoutParams().height == ActionBar.LayoutParams.MATCH_PARENT))
                mScale = Math.min(((float)height)/mFrameWidth, ((float)width)/mFrameHeight); 
            else
                mScale = 0;

你就完成了!希望它有所帮助..

【讨论】:

  • 我发现此更改的唯一问题是我现在对图像的实时修改不一致。我在图像中绘制了一些现在只有黑色的彩色线条。我会尝试调查,但如果你有一些线索:)
  • 你能详细说明你的问题吗?
  • 抱歉错误自行消失了,我确定是我做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
相关资源
最近更新 更多