目錄

前言
之前實現(xiàn)了本地圖片的銀行卡號的掃描,這次順帶實現(xiàn)了下相機掃描的識別,我是用的農(nóng)業(yè)銀行卡測試的,識別速度還是挺nice的
效果展示

實現(xiàn)步驟
核心步驟與我的這篇文章一樣:Android OpenCV + tess-two 實現(xiàn)銀行卡識別:本地圖片識別
這里掃描的主要是換成了對于相機數(shù)據(jù)的處理,這里我使用的是CameraX獲取的相機數(shù)據(jù),對于相機的回調(diào)方法的處理在如下方法中:

這里我將相機數(shù)據(jù)轉(zhuǎn)換為Bitmap使用的是Google的這個庫:
implementation "com.google.mlkit:image-labeling:17.0.7"
使用代碼如下:
val image = InputImage.fromMediaImage(it, 0)
var bitmap = ImageConvertUtils.getInstance().getUpRightBitmap(image)
另外這里還有個重要的步驟就是要根據(jù)圖像的亮度來適當(dāng)?shù)恼{(diào)節(jié)相機的曝光度,代碼如下:
@SuppressLint("UnsafeOptInUsageError")
private fun adjustBrightness(grayMat:Mat) {
//調(diào)節(jié)亮度的頻率不要太高
if(System.currentTimeMillis() - adjustBrightnessTime >= 1000){
adjustBrightnessTime = System.currentTimeMillis()
//獲取圖像的亮度
val avg = Core.mean(grayMat)
LogUtils.eTag("相機亮度",avg.`val`,exposureIndex)
//獲取相機曝光度支持設(shè)置的范圍
val range = camera.cameraInfo.exposureState.exposureCompensationRange
//當(dāng)圖像亮度大于140的時候就減少曝光度
if(avg.`val`[0] > 140){
//判斷相機是否支持將要調(diào)節(jié)的曝光度
if (range.contains(exposureIndex - 1)) {
camera.cameraControl.setExposureCompensationIndex(--exposureIndex)
}
}else if(avg.`val`[0] < 120){
//當(dāng)圖像亮度小于120的時候就增加曝光度
if (range.contains(exposureIndex + 1)) {
camera.cameraControl.setExposureCompensationIndex(++exposureIndex)
}
}
}
}