我正在尝试进行自定义帧处理,以创建ML-Kit OCR应用。我首先使用FotoApparat创建了一个简单的相机应用。
然后我在FotoApparat的初始化中添加了一个自定义帧处理匿名函数。
private fun createFotoapparat(){
val cameraView = findViewById<CameraView>(R.id.camera_view)
fotoapparat = Fotoapparat
.with(this)
.into(cameraView)
.previewScaleType(ScaleType.CenterCrop)
.lensPosition(back())
.logger(loggers(logcat()))
.cameraErrorCallback({error -> println("Recorder errors: $error")})
.frameProcessor { frame ->
Log.d("Frameprocessor", "Fired")
val rotation = getRotationCompensation("0", this, baseContext)
val BAimage = frame.image
val metadata = FirebaseVisionImageMetadata.Builder()
.setWidth(480) // 480x360 is typically sufficient for
.setHeight(360) // image recognition
.setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
.setRotation(rotation)
.build()
var FBimage = FirebaseVisionImage.fromByteArray(BAimage, metadata)
val detector = FirebaseVision.getInstance()
.onDeviceTextRecognizer
val result = detector.processImage(FBimage)
.addOnSuccessListener { firebaseVisionText ->
Log.d("OnSuccess", "Triggered")
for (block in firebaseVisionText.textBlocks){
val blockText = block.text
val blockConfidence = block.confidence
Log.d("newframe", blockText)
Log.d(blockText, blockConfidence.toString())
}
}
.addOnFailureListener {
Log.e("err", "line 114", it)
}
}.build()
}
我的问题是它正在返回废话,置信度为空值。这是一些logcat输出,当它查看带有少量键入文本的简单图像时。
2019-03-01 14:24:56.735 16117-16117/me.paxana.myapplication D/newframe: 111
2019-03-01 14:24:56.735 16117-16117/me.paxana.myapplication D/111: null
我可以根据需要发布更多的代码,也可以发布更多的logcat,但是我感觉这里缺少主要的东西。
答案 0 :(得分:0)
我部分理解了。我的旋转算法是错误的,我必须以90度角拍摄照片,然后才能完美工作。这是我的轮换算法,我将在更新后对其进行更新。
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Throws(CameraAccessException::class)
private fun getRotationCompensation(cameraId: String, activity: Activity, context: Context): Int {
// Get the device's current rotation relative to its "native" orientation.
// Then, from the ORIENTATIONS table, look up the angle the image must be
// rotated to compensate for the device's rotation.
val deviceRotation = activity.windowManager.defaultDisplay.rotation
var rotationCompensation = ORIENTATIONS.get(deviceRotation)
// On most devices, the sensor orientation is 90 degrees, but for some
// devices it is 270 degrees. For devices with a sensor orientation of
// 270, rotate the image an additional 180 ((270 + 270) % 360) degrees.
val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
val sensorOrientation = cameraManager
.getCameraCharacteristics(cameraId)
.get(CameraCharacteristics.SENSOR_ORIENTATION)!!
rotationCompensation = (rotationCompensation + sensorOrientation + 270) % 360
// Return the corresponding FirebaseVisionImageMetadata rotation value.
val result: Int
when (rotationCompensation) {
0 -> result = FirebaseVisionImageMetadata.ROTATION_0
90 -> result = FirebaseVisionImageMetadata.ROTATION_90
180 -> result = FirebaseVisionImageMetadata.ROTATION_180
270 -> result = FirebaseVisionImageMetadata.ROTATION_270
else -> {
result = FirebaseVisionImageMetadata.ROTATION_0
Log.e("Err", "Bad rotation value: $rotationCompensation")
}
}
return result
}
}