alpha
Login
or
Join now
nateholland.bsky.social
/
PoseDetection
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
This repository has no description
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
Overview
Issues
Pulls
Pipelines
feat: support back camera
author
nathan holland
date
1 year ago
(May 3, 2025, 12:36 AM +0300)
commit
ee326369
ee3263692b8047a8d228b6be9a2fe542be0ff23c
parent
8bd83df9
8bd83df986a87eeb9feff2ac83f6c56b16c3dbe9
+11
-10
4 changed files
Expand all
Collapse all
Unified
Split
posedetection
src
androidMain
kotlin
com.performancecoachlab
posedetection
camera
CameraView.android.kt
commonMain
kotlin
com
performancecoachlab
posedetection
camera
CameraView.kt
iosMain
kotlin
com
performancecoachlab
posedetection
camera
CameraView.ios.kt
sample
composeApp
src
commonMain
kotlin
com
nate
posedetection
App.kt
+3
-2
posedetection/src/androidMain/kotlin/com.performancecoachlab/posedetection/camera/CameraView.android.kt
Reviewed
···
2
2
3
3
import android.graphics.Bitmap
4
4
import androidx.annotation.OptIn
5
5
+
import androidx.camera.core.CameraSelector.DEFAULT_BACK_CAMERA
5
6
import androidx.camera.core.CameraSelector.DEFAULT_FRONT_CAMERA
6
7
import androidx.camera.core.ExperimentalGetImage
7
8
import androidx.camera.view.LifecycleCameraController
···
41
42
@OptIn(ExperimentalGetImage::class)
42
43
@Composable
43
44
actual fun CameraView(
44
44
-
skeletonRepository: SkeletonRepository, drawSkeleton: Boolean, modifier: Modifier
45
45
+
skeletonRepository: SkeletonRepository, drawSkeleton: Boolean, modifier: Modifier, frontCamera: Boolean
45
46
) {
46
47
var bitmap by remember { mutableStateOf<ImageBitmap?>(null) }
47
48
var skeleton by remember { mutableStateOf(Skeleton()) }
···
55
56
val executor = remember { Executors.newSingleThreadExecutor() }
56
57
LaunchedEffect(lifecycleOwner) {
57
58
cameraController.bindToLifecycle(lifecycleOwner)
58
58
-
cameraController.cameraSelector = DEFAULT_FRONT_CAMERA
59
59
+
cameraController.cameraSelector = if(frontCamera)DEFAULT_FRONT_CAMERA else DEFAULT_BACK_CAMERA
59
60
previewView.controller = cameraController
60
61
previewView.scaleType = PreviewView.ScaleType.FIT_CENTER
61
62
cameraController.setImageAnalysisAnalyzer(executor) { imageProxy ->
+2
-1
posedetection/src/commonMain/kotlin/com/performancecoachlab/posedetection/camera/CameraView.kt
Reviewed
···
9
9
expect fun CameraView(
10
10
skeletonRepository: SkeletonRepository,
11
11
drawSkeleton: Boolean = true,
12
12
-
modifier: Modifier = Modifier.fillMaxSize()
12
12
+
modifier: Modifier = Modifier.fillMaxSize(),
13
13
+
frontCamera: Boolean = true,
13
14
)
+5
-6
posedetection/src/iosMain/kotlin/com/performancecoachlab/posedetection/camera/CameraView.ios.kt
Reviewed
···
19
19
actual fun CameraView(
20
20
skeletonRepository: SkeletonRepository,
21
21
drawSkeleton: Boolean,
22
22
-
modifier: Modifier
22
22
+
modifier: Modifier,
23
23
+
frontCamera: Boolean,
23
24
) {
24
25
val cameraEngine = remember { mutableStateOf<CameraEngine?>(null) }
25
25
-
val skeleton by skeletonRepository.skeletonFlow.collectAsState()
26
26
val frameListener = remember { FrameRepository() }
27
27
val frameBitmap by frameListener.frameFlow.collectAsState()
28
28
-
LaunchedEffect(cameraEngine.value){
28
28
+
LaunchedEffect(cameraEngine.value) {
29
29
cameraEngine.value?.apply {
30
30
addSkeletonRepository(skeletonRepository)
31
31
addFrameListener(frameListener)
···
34
34
}
35
35
Box(modifier = Modifier.fillMaxSize()) {
36
36
CameraPreview(
37
37
-
modifier = Modifier.fillMaxSize(),
38
38
-
onCameraControllerReady = { engine ->
39
39
-
cameraEngine.value = engine
37
37
+
modifier = Modifier.fillMaxSize(), onCameraControllerReady = { engine ->
38
38
+
cameraEngine.value = engine.also { if (!frontCamera) it.toggleCameraLens() }
40
39
})
41
40
if (drawSkeleton) {
42
41
frameBitmap?.also {
+1
-1
sample/composeApp/src/commonMain/kotlin/com/nate/posedetection/App.kt
Reviewed
···
30
30
if (permissionGranted) CameraView(
31
31
skeletonRepository = skeletonRepository,
32
32
drawSkeleton = true,
33
33
-
modifier = Modifier.fillMaxSize()
33
33
+
modifier = Modifier.fillMaxSize(),
34
34
)
35
35
else Text("Camera permission not granted")
36
36