使用 OpenCv 的文档检测在 Android 中形成性能下降

Document detection using OpenCv forming performance degradation in Android

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

Rotating Android Camera to Portrait

但是,我可以在 纵向模式下更改相机方向,但存在一些性能下降问题

有人成功过吗?

我也在寻找 除了 OpenCv 之外的其他自动检测文档的选项。我不知道 没有 OpenCv 是否可行

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

我用 opencv 遇到了同样的问题,经过数小时的研究,我终于找到了解决方案。您必须对默认 opencv class 进行更改。
按照以下步骤操作: 1) 在 CameraBridgeViewBase class 添加以下代码

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 class 中替换 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 之外,还有其他方法可以自动检测对象