This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

fix: smooth out ios skeletons

+39 -1
+2
posedetection/src/iosMain/kotlin/com/performancecoachlab/posedetection/camera/CameraEngine.kt
··· 390 390 frameProcessor.analyseFrame( 391 391 cgImage, timestamp 392 392 ) { skeleton -> 393 + println("timestamp: $timestamp") 394 + println(skeleton?.toString() ?: "No skeleton detected") 393 395 cameraPreviewLayer?.also { preview -> 394 396 skeleton?.let { 395 397 mapSkeletonToPreview(
+37 -1
posedetection/src/iosMain/kotlin/com/performancecoachlab/posedetection/camera/FrameProcessor.kt
··· 76 76 } 77 77 } 78 78 79 + class SkelBuffer(private val maxSize: Int) { 80 + private val buffer = ArrayDeque<Skeleton>() 81 + 82 + fun add(skeleton: Skeleton) { 83 + buffer.addLast(skeleton) 84 + if (buffer.size > maxSize) buffer.removeFirst() 85 + } 86 + 87 + fun smooth(skeleton: Skeleton): Skeleton { 88 + add(skeleton) 89 + val recentSkeletons = buffer.filter { it.timestamp >= skeleton.timestamp - 200 } 90 + fun findMostRecentNonNullPoint(selector: (Skeleton) -> Skeleton.SkeletonCoordinate?): Skeleton.SkeletonCoordinate? { 91 + return recentSkeletons.asReversed().firstNotNullOfOrNull(selector) 92 + } 93 + 94 + return Skeleton( 95 + timestamp = skeleton.timestamp, 96 + leftShoulder = skeleton.leftShoulder ?: findMostRecentNonNullPoint { it.leftShoulder }, 97 + rightShoulder = skeleton.rightShoulder ?: findMostRecentNonNullPoint { it.rightShoulder }, 98 + leftElbow = skeleton.leftElbow ?: findMostRecentNonNullPoint { it.leftElbow }, 99 + rightElbow = skeleton.rightElbow ?: findMostRecentNonNullPoint { it.rightElbow }, 100 + leftWrist = skeleton.leftWrist ?: findMostRecentNonNullPoint { it.leftWrist }, 101 + rightWrist = skeleton.rightWrist ?: findMostRecentNonNullPoint { it.rightWrist }, 102 + leftHip = skeleton.leftHip ?: findMostRecentNonNullPoint { it.leftHip }, 103 + rightHip = skeleton.rightHip ?: findMostRecentNonNullPoint { it.rightHip }, 104 + leftKnee = skeleton.leftKnee ?: findMostRecentNonNullPoint { it.leftKnee }, 105 + rightKnee = skeleton.rightKnee ?: findMostRecentNonNullPoint { it.rightKnee }, 106 + leftAnkle = skeleton.leftAnkle ?: findMostRecentNonNullPoint { it.leftAnkle }, 107 + rightAnkle = skeleton.rightAnkle ?: findMostRecentNonNullPoint { it.rightAnkle }, 108 + width = skeleton.width, 109 + height = skeleton.height 110 + ) 111 + } 112 + } 113 + 79 114 @OptIn(ExperimentalForeignApi::class) 80 115 class FrameProcessor() { 116 + private val skelBuffer = SkelBuffer(maxSize = 10) 81 117 private var regionOfInterest = CGRectMake(0.0, 0.0, 1.0, 1.0) 82 118 @OptIn(BetaInteropApi::class) 83 119 fun analyseFrame(cgImage: CGImageRef?, timestamp: Long, onProccessed: (Skeleton?) -> Unit) { ··· 143 179 height = height.toFloat(), 144 180 width = width.toFloat() 145 181 ) 146 - onProccessed(updatedSkeleton) 182 + onProccessed(skelBuffer.smooth(updatedSkeleton)) 147 183 } 148 184 } 149 185 }