Created
December 15, 2020 18:15
-
-
Save anupamchugh/46af4561f4fc252fe550d879af55961e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension ViewController: AVCaptureVideoDataOutputSampleBufferDelegate { | |
public func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { | |
var thumbTip: CGPoint? | |
var wrist: CGPoint? | |
let handler = VNImageRequestHandler(cmSampleBuffer: sampleBuffer, orientation: .up, options: [:]) | |
do { | |
// Perform VNDetectHumanHandPoseRequest | |
try handler.perform([handPoseRequest]) | |
guard let observation = handPoseRequest.results?.first else { | |
cameraView.showPoints([]) | |
return | |
} | |
// Get points for all fingers | |
let thumbPoints = try observation.recognizedPoints(.thumb) | |
let wristPoints = try observation.recognizedPoints(.all) | |
let indexFingerPoints = try observation.recognizedPoints(.indexFinger) | |
let middleFingerPoints = try observation.recognizedPoints(.middleFinger) | |
let ringFingerPoints = try observation.recognizedPoints(.ringFinger) | |
let littleFingerPoints = try observation.recognizedPoints(.littleFinger) | |
// Extract individual points from Point groups. | |
guard let thumbTipPoint = thumbPoints[.thumbTip], | |
let indexTipPoint = indexFingerPoints[.indexTip], | |
let middleTipPoint = middleFingerPoints[.middleTip], | |
let ringTipPoint = ringFingerPoints[.ringTip], | |
let littleTipPoint = littleFingerPoints[.littleTip], | |
let wristPoint = wristPoints[.wrist] | |
else { | |
cameraView.showPoints([]) | |
return | |
} | |
let confidenceThreshold: Float = 0.3 | |
guard thumbTipPoint.confidence > confidenceThreshold && | |
indexTipPoint.confidence > confidenceThreshold && | |
middleTipPoint.confidence > confidenceThreshold && | |
ringTipPoint.confidence > confidenceThreshold && | |
littleTipPoint.confidence > confidenceThreshold && | |
wristPoint.confidence > confidenceThreshold | |
else { | |
cameraView.showPoints([]) | |
return | |
} | |
// Convert points from Vision coordinates to AVFoundation coordinates. | |
thumbTip = CGPoint(x: thumbTipPoint.location.x, y: 1 - thumbTipPoint.location.y) | |
wrist = CGPoint(x: wristPoint.location.x, y: 1 - wristPoint.location.y) | |
DispatchQueue.main.async { | |
self.processPoints([thumbTip, wrist]) | |
} | |
} catch { | |
cameraFeedSession?.stopRunning() | |
let error = AppError.visionError(error: error) | |
DispatchQueue.main.async { | |
error.displayInViewController(self) | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment