Skip to content

Instantly share code, notes, and snippets.

View tdcolvin's full-sized avatar

Tom Colvin tdcolvin

View GitHub Profile
// Convert it to an emoji
val gesture = when(bestCategory?.categoryName()) {
"Thumb_Up" -> "\uD83D\uDC4D"
"Thumb_Down" -> "\uD83D\uDC4E"
"Pointing_Up" -> "☝\uFE0F"
"Open_Palm" -> "✋"
"Closed_Fist" -> "✊"
"Victory" -> "✌\uFE0F"
"ILoveYou" -> "\uD83E\uDD1F"
else -> null
private fun handleGestureRecognizerResult(result: GestureRecognizerResult) {
// Figure out the most likely gesture
val bestCategory = result.gestures()
.firstOrNull()
?.maxByOrNull { it.score() }
}
val imageAnalyzer = ImageAnalysis.Analyzer { image ->
...
gestureRecognizer.recognizeAsync(
BitmapImageBuilder(scaledAndRotatedBitmap).build(),
System.currentTimeMillis()
)
}
val imageAnalyzer = ImageAnalysis.Analyzer { image ->
val imageBitmap = image.toBitmap()
val scale = 500f / max(image.width, image.height)
// Create a bitmap that's scaled as needed for the model, and rotated as needed to match display orientation
val scaleAndRotate = Matrix().apply {
postScale(scale, scale)
postRotate(image.imageInfo.rotationDegrees.toFloat())
}
val scaledAndRotatedBmp = Bitmap.createBitmap(imageBitmap, 0, 0, image.width, image.height, scaleAndRotate, true)
private val gestureRecognizer by lazy {
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath("gesture_recognizer.task")
val baseOptions = baseOptionsBuilder.build()
val optionsBuilder =
GestureRecognizer.GestureRecognizerOptions.builder()
.setBaseOptions(baseOptions)
.setResultListener { result, _ -> handleGestureRecognizerResult(result) }
.setRunningMode(RunningMode.LIVE_STREAM)
dependencies {
...
implementation(libs.tasks.vision)
}
@Composable
fun CameraPreview(
modifier: Modifier = Modifier,
imageAnalysisUseCase: ImageAnalysis?
) {
...
fun rebindCameraProvider() {
...
cameraProvider.bindToLifecycle(
class HandGestureViewModel(application: Application): AndroidViewModel(application) {
...
val imageAnalyzer = ImageAnalysis.Analyzer { image ->
Log.v("cameraxdemo", "Received frame for analysis: ${image.width} x ${image.height}")
image.close()
}
}
@Composable
fun CameraPreview(
modifier: Modifier = Modifier
) {
val previewUseCase = remember { androidx.camera.core.Preview.Builder().build() }
var cameraProvider by remember { mutableStateOf<ProcessCameraProvider?>(null) }
val localContext = LocalContext.current
val imageAnalysisUseCase = remember {
ImageAnalysis.Builder().build().apply {
setAnalyzer(context.mainExecutor, viewModel.imageAnalyzer)
}
}