【问题标题】:Document detection using OpenCv forming performance degradation in Android在 Android 中使用 OpenCv 进行文档检测形成性能下降
【发布时间】:2017-05-28 10:59:26
【问题描述】:

我是使用 android 的 OpenCv 的新手。我正在尝试制作一个使用 OpenCv - 2.4.13 自动检测文档的应用程序。在我的应用程序中,有一个检测文档的功能(像 Scanbot 应用程序),然后将其转换为文档。 到目前为止,我能够在横向模式下使用 opencv 检测文档。 我需要的是在纵向模式下显示应用程序。因为,默认情况下,OpenCv for android 在横向模式下工作,我希望它在 portrait mode 。 我已经为此尝试了很多解决方案,它也有效,但存在性能下降问题(例如相机帧速度变慢)。 到目前为止我经历的是: Rotate camera preview to Portrait Android OpenCV Camera

Rotating Android Camera to Portrait

但是,我可以在纵向更改相机方向,但会出现一些性能下降问题

有人成功做到了吗?

我也在寻找除 OpenCv 之外的自动检测文档的其他选项。我不知道是否可以不使用 OpenCv

是否可以在没有 OpenCv 的情况下自动检测文档?怎么样?

【问题讨论】:

    标签: android opencv camera android-camera opencv4android


    【解决方案1】:

    我在使用 opencv 时遇到了同样的问题,经过数小时的研究,我终于找到了解决方案。您必须在默认的 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 方法中将上面的 bitmap 替换为 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;
    

    你完成了!

    我不认为,除了 OpenCv 之外,还有其他方法可以自动检测对象

    【讨论】:

    猜你喜欢
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 2018-02-28
    • 2019-02-25
    • 2017-11-05
    • 1970-01-01
    相关资源
    最近更新 更多