目录
前言
之前实现了本地图片的银行卡号的扫描,这次顺带实现了下相机扫描的识别,我是用的农业银行卡测试的,识别速度还是挺nice的
效果展示
实现步骤
核心步骤与我的这篇文章一样:Android OpenCV + tess-two 实现银行卡识别:本地图片识别
这里扫描的主要是换成了对于相机数据的处理,这里我使用的是CameraX获取的相机数据,对于相机的回调方法的处理在如下方法中:
这里我将相机数据转换为Bitmap使用的是Google的这个库:
implementation "com.google.mlkit:image-labeling:17.0.7"
使用代码如下:
val image = InputImage.fromMediaImage(it, 0)
var bitmap = ImageConvertUtils.getInstance().getUpRightBitmap(image)
另外这里还有个重要的步骤就是要根据图像的亮度来适当的调节相机的曝光度,代码如下:
@SuppressLint("UnsafeOptInUsageError")
private fun adjustBrightness(grayMat:Mat) {
//调节亮度的频率不要太高
if(System.currentTimeMillis() - adjustBrightnessTime >= 1000){
adjustBrightnessTime = System.currentTimeMillis()
//获取图像的亮度
val avg = Core.mean(grayMat)
LogUtils.eTag("相机亮度",avg.`val`,exposureIndex)
//获取相机曝光度支持设置的范围
val range = camera.cameraInfo.exposureState.exposureCompensationRange
//当图像亮度大于140的时候就减少曝光度
if(avg.`val`[0] > 140){
//判断相机是否支持将要调节的曝光度
if (range.contains(exposureIndex - 1)) {
camera.cameraControl.setExposureCompensationIndex(--exposureIndex)
}
}else if(avg.`val`[0] < 120){
//当图像亮度小于120的时候就增加曝光度
if (range.contains(exposureIndex + 1)) {
camera.cameraControl.setExposureCompensationIndex(++exposureIndex)
}
}
}
}