要对骨架的坐标进行水平镜像处理,您可以遍历 poseLandmarkerResult.landmarks
中的每个点,并将其 x 坐标进行镜像处理。具体来说,对于一个坐标点 (x, y)
,您需要计算出镜像后的 x 值:mirroredX = imageSize.width - x
。以下是修改后的代码:
extension CameraViewController: PoseLandmarkerServiceLiveStreamDelegate {
func poseLandmarkerService(
_ poseLandmarkerService: PoseLandmarkerService,
didFinishDetection result: ResultBundle?,
error: Error?) {
DispatchQueue.main.async { [weak self] in
guard let weakSelf = self else { return }
weakSelf.inferenceResultDeliveryDelegate?.didPerformInference(result: result)
guard let poseLandmarkerResult = result?.poseLandmarkerResults.first as? PoseLandmarkerResult else { return }
let imageSize = weakSelf.cameraFeedService.videoResolution
// 镜像处理骨架坐标
var mirroredLandmarks: [PoseLandmark] = []
for landmark in poseLandmarkerResult.landmarks {
let mirroredX = imageSize.width - landmark.x // 水平镜像处理
let mirroredY = landmark.y // y 坐标不变
let mirroredLandmark = PoseLandmark(x: mirroredX, y: mirroredY, visibility: landmark.visibility) // 假设PoseLandmark有visibility属性
mirroredLandmarks.append(mirroredLandmark)
}
let poseOverlays = OverlayView.poseOverlays(
fromMultiplePoseLandmarks: mirroredLandmarks,
inferredOnImageOfSize: imageSize,
ovelayViewSize: weakSelf.overlayView.bounds.size,
imageContentMode: weakSelf.overlayView.imageContentMode,
andOrientation: UIImage.Orientation.from(deviceOrientation: UIDevice.current.orientation))
weakSelf.overlayView.draw(poseOverlays: poseOverlays,
inBoundsOfContentImageOfSize: imageSize,
imageContentMode: weakSelf.cameraFeedService.videoGravity.contentMode)
}
}
}
在这个修改后的代码中,我们创建了一个新的数组 mirroredLandmarks
,用于保存经过水平镜像处理的骨架坐标。每个原始骨架点的 x 坐标被替换为其水平镜像值,而 y 坐标保持不变。这样可以确保最终显示在界面上的骨架是经过适当处理的。
内容由零声教学AI助手提供,问题来源于学员提问