SmartCamera 高性能单反实时采集识别框架, 支持算法可配置化调优

优采云 发布时间: 2020-08-17 01:53

  SmartCamera 高性能单反实时采集识别框架, 支持算法可配置化调优

  

  English

  SmartCamera 是一个 Android 相机拓展库,提供了一个高度可订制的实时扫描模块才能实时采集并且辨识单反内物体边框是否吻合指定区域。如果认为还不错,欢迎 star,fork。

  语言描述上去略显生硬,具体实现的功能如下图所示,适用于*敏*感*词*,名片,文档等内容的扫描、自动拍摄而且剪裁, 你也可以下载 apk 体验:

  SmartCamera-Sample-debug.apk

  

  在单反实现上,SmartCamera 以源码的形式引用了 Google 开源的 CameraView ,并且稍作更改以支持 Camera.PreviewCallback 回调来获取单反预览流。

  SmartCameraView 继承于修改后的 CameraView,为其添加了一个选框遮罩视图( MaskView )和一个实时扫描模块( SmartScanner )。其中选框视图即是你听到的单反里面的那层选定框,并配备了一个由上到下的扫描疗效,当然你也可以实现 MaskViewImpl 接口来自定义选框视图。

  实时扫描模块( SmartScanner )是本库的核心功能所在,配合单反 PreviewCallback 接口反弹的预览流和选框视图 MaskView 提供的选框区域 RectF,能以不错的性能实时判别出内容是否吻合选框。

  你也可以关注我的另一个库 SmartCropper: 一个简单易用的智能图片剪裁库,适用于*敏*感*词*,名片,文档等合照的剪裁。

  扫描算法调优

  SmartScanner 提供了丰富的算法配置,使用者可以自己更改扫描算法以获得更好的适配性,阅读附表一提供的各参数使用说明来获得更好的辨识疗效。

  

  为了更方便、高效地调优算法,SmartScanner 贴心地为你提供了扫描预览模式,开启预览功能后,你可以通过 SmartScanner 获取每一帧处理的结果输出到 ImageView 中实时观察 native 层扫描的结果,其中白线区域即为边沿测量的结果,白线加粗区域即为辨识出的边框。

  

  你的目标是通过调节 SmartScanner 的各个参数促使内容边界清晰可见,识别出的边框(白色加粗线段)准确无误。

  注:SmartCamera 在各方面做了性能以及显存上的优化,但是出于不必要的性能资源浪费,算法参数调优结束后请关掉预览模式。

  接入

  1.根目录下的 build.gradle 添加:

  allprojects {

repositories {

...

maven { url 'https://jitpack.io' }

}

}

  2.添加依赖

  dependencies {

implementation 'com.github.pqpo:SmartCamera:v1.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 各个方法的含义详见附录二

  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 < height) {

maskView.setMaskSize((int) (width * 0.6f), (int) (width * 0.6f / 0.63));

maskView.setMaskOffset(0, -(int)(width * 0.1));

} else {

maskView.setMaskSize((int) (width * 0.6f), (int) (width * 0.6f * 0.63));

}

}

});

mCameraView.setMaskView(maskView);

  4. 配置 SmartCameraView1. 开启预览:

  mCameraView.getSmartScanner().setPreview(true);

mCameraView.setOnScanResultListener(new SmartCameraView.OnScanResultListener() {

@Override

public boolean onScanResult(SmartCameraView smartCameraView, int result) {

Bitmap previewBitmap = smartCameraView.getPreviewBitmap();

if (previewBitmap != null) {

ivPreview.setImageBitmap(previewBitmap);

}

return false;

}

});

  通过第一句代码开启了预览模式。

  你可以通过 setOnScanResultListener 设置反弹获得每一帧的扫描结果,其中 result == 1 表示辨识结果吻合边框

  若开启了预览模式,你可以在反弹中使用 smartCameraView.getPreviewBitmap() 方法获取每一帧处理的结果。

  返回值为 false 表示不拦截扫描结果,这时 SmartCameraView 内部会在 result 为 1 的情况下手动触发照相,若你自己处理了扫描结果返回 true 即可。

  2. 获取照相结果,并且剪裁选框区域:

  mCameraView.addCallback(new CameraView.Callback() {

@Override

public void onPictureTaken(CameraView cameraView, byte[] data) {

super.onPictureTaken(cameraView, data);

// 异步裁剪图片

mCameraView.cropImage(data, new SmartCameraView.CropCallback() {

@Override

public void onCropped(Bitmap cropBitmap) {

if (cropBitmap != null) {

showPicture(cropBitmap);

}

}

);

}

});

  获取照相结果的反弹是 CameraView 提供的,你只须要在内部调用 SmartCameraView 提供的 cropImage 方法即可获取选框区域内的剪裁图片

  注:其他关于 SmartCameraView 的使用方式同 CameraView ,另外更具体的使用方式请参考 app 内代码

  附录

  见 github

  感谢关于我:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线