SmartCamera: SmartCamera 是一个 Android 相机拓
优采云 发布时间: 2020-08-22 04:46SmartCamera: SmartCamera 是一个 Android 相机拓
English
SmartCamera 是一个 Android 相机拓展库,提供了一个高度可订制的实时扫描模块才能实时采集并且辨识单反内物体边框是否吻合指定区域。如果认为还不错,欢迎 star,fork。
语言描述上去略显生硬,具体实现的功能如下图所示,适用于*敏*感*词*,名片,文档等内容的扫描、自动拍摄而且剪裁。
你可以下载体验集成了 SmartCamera 的 《卡片备忘录》, 将卡片装进你的手机:
也可以下载 demo apk SmartCamera-Sample-debug.apk 体验:
实时扫描模块(SmartScanner)是本库的核心功能所在,配合单反 PreviewCallback 接口反弹的预览流和选框视图 MaskView 提供的选框区域 RectF,能以不错的性能实时判别出内容是否吻合选框。
为了更方便的使用 Android Camera,SmartCamera 以源码的形式引用了 Google 开源的 CameraView ,并且稍作更改以支持 Camera.PreviewCallback 回调来获取单反预览流。
SmartCameraView 继承于修改后的 CameraView,为其添加了一个选框遮罩视图(MaskView)和一个实时扫描模块(SmartScanner)。其中选框视图即是你听到的单反里面的那层选定框,并配备了一个由上到下的扫描疗效,当然你也可以实现 MaskViewImpl 接口来自定义选框视图。
你只要使用本库提供的 SmartCameraView 即可实现上述 Demo 中的疗效, 当然假如你的项目中早已实现了单反模块,你也可以直接使用 SmartScanner 来实现实时扫描疗效。
(你也可以关注我的另一个库 SmartCropper: 一个简单易用的智能图片剪裁库,适用于*敏*感*词*,名片,文档等合照的剪裁。)
SmartCamera 原理剖析:Android 端单反视频流采集与实时边框辨识
扫描算法调优SmartScanner 提供了丰富的算法配置,使用者可以自己更改扫描算法以获得更好的适配性,阅读附表一提供的各参数使用说明来获得更好的辨识疗效。
为了更方便、高效地调优算法,SmartScanner 贴心地为你提供了扫描预览模式,开启预览功能后,你可以通过 SmartScanner 获取每一帧处理的结果输出到 ImageView 中实时观察 native 层扫描的结果,其中白线区域即为边沿测量的结果,白线加粗区域即为辨识出的边框。
你的目标是通过调节 SmartScanner 的各个参数促使内容边界清晰可见,识别出的边框(白色加粗线段)准确无误。
注:SmartCamera 在各方面做了性能以及显存上的优化,但是出于不必要的性能资源浪费,算法参数调优结束后请关掉预览模式。
接入
1.根目录下的 build.gradle 添加:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
2.添加依赖
dependencies {
implementation 'com.github.pqpo:SmartCamera:v2.0.0'
}
注意:由于使用了 JNI, 请防止混淆
-keep class me.pqpo.smartcameralib.**{*;}
使用1. 引入单反布局,并启动单反(必要时启动预览)
@Override
protected void onResume() {
super.onResume();
mCameraView.start();
mCameraView.startScan();
}
@Override
protected void onPause() {
mCameraView.stop();
super.onPause();
if (alertDialog != null) {
alertDialog.dismiss();
}
mCameraView.stopScan();
}
注:若开启了预览别忘了调用相应开启、结束预览的技巧。
2. 修改扫描模块参数(可选,调优算法,同时按第4步中开启预览模式)
扫描模块各个参数含义详见附录一
private void initScannerParams() {
SmartScanner.DEBUG = true;
SmartScanner.detectionRatio = 0.1f;
SmartScanner.checkMinLengthRatio = 0.8f;
SmartScanner.cannyThreshold1 = 20;
SmartScanner.cannyThreshold2 = 50;
SmartScanner.houghLinesThreshold = 130;
SmartScanner.houghLinesMinLineLength = 80;
SmartScanner.houghLinesMaxLineGap = 10;
SmartScanner.firstGaussianBlurRadius = 3;
SmartScanner.secondGaussianBlurRadius = 3;
SmartScanner.maxSize = 300;
SmartScanner.angleThreshold = 5;
// don't forget reload params
SmartScanner.reloadParams();
}
注: 修改参数后别忘掉通知 native 层重新加载参数: SmartScanner.reloadParams();
3. 配置遮罩选框视图(可选,若要更改默认的视图, 或要更改选框区域)
配置 MaskView 各个方法的含义详见附录二
<p>final MaskView maskView = (MaskView) mCameraView.getMaskView();;
maskView.setMaskLineColor(0xff00adb5);
maskView.setShowScanLine(true);
maskView.setScanLineGradient(0xff00adb5, 0x0000adb5);
maskView.setMaskLineWidth(2);
maskView.setMaskRadius(5);
maskView.setScanSpeed(6);
maskView.setScanGradientSpread(80);
mCameraView.post(new Runnable() {
@Override
public void run() {
int width = mCameraView.getWidth();
int height = mCameraView.getHeight();
if (width