QuickPose provides developer-oriented cutting edge ML features of MediaPipe and BlazePose, with easy integration and production ready code. Dramatically improving the speed of implementation of MediaPipe and BlazePose's pose estimation and skeleton tracking features into mobile applications.
- Register an SDK Key
- How it works
- Features
- Meta Features
- Supported Platforms
- Requirements
- Installing the SDK
- Getting Started
- Troubleshooting
Get your free SDK key on https://dev.quickpose.ai, usage limits may apply. SDK Keys are linked to your bundle ID, please check Key before distributing to the App Store.
QuickPose process a video frame and makes it easy for developers to perform complex AI features to the image, such as overlaying markings to the output image to highlight the user's pose.
+----------+ +-------------+ +-----------------+
| | | | | Overlay Image |
| Camera |--------->| QuickPose |--------->| + |
| | | | | Results |
+----------+ +-------------+ +-----------------+
Feature | Example | Supported |
---|---|---|
Stacked Feature Styling | Bike Side View Video by Tariq Ali |
v0.4 |
Conditional Styling | v0.4 | |
Fitness - Guidance Body Position Named Leg or Arm not visible |
v0.8 |
iOS Device | Silicon Mac (M1, M2, etc) | iOS Simulator x86_64 | iOS Simulator arm64 |
---|---|---|---|
✅ Runs | ✅ Runs | ⚙ Compiles | ⚙ Known Issue |
- iOS 14.0+
- Xcode 10.0+
Step 1: Click on Xcode project file
Step 2: Click on Swift Packages and click on the plus to add a package
Step 3: Enter the following repository url https://github.com/quickpose/quickpose-ios-sdk.git
and click next
Step 4: Choose all modules and click add package.
Module | Description |
---|---|
QuickPoseCore | Core SDK (required) |
QuickPoseMP | Mediapipe Library (required) |
QuickPoseCamera | Utility Class for Integration (optional, recommended) |
QuickPoseSwiftUI | Utility Classes for SwiftUI Integration (optional, recommended) |
See code examples below or download our Sample Apps.
Step 1: Download/Clone Repo
Step 2: Open Basic Demo
Step 3: Choose Build Target "My Mac (Designed For iPad/iPhone)"
Step 4: Run
Step 5: Explore the features and returned results
quickPose.start(features: [.overlay(.upperBody)], onFrame: { status, image, features, guidance, landmarks in
if case .success(_) = status {
overlayImage = image
}
})
Step 1: Download/Clone Repo
Step 2: Open Basic Demo
Step 3: Choose Build Target as your physical device
Step 5: You will need to change the bundleid and register with apple if you haven't already.
Step 5: Run
Step 6: Explore the features and returned results
quickPose.start(features: [.overlay(.upperBody)], onFrame: { status, image, features, guidance, landmarks in
if case .success(_) = status {
overlayImage = image
}
})
For reference docs see https://quickpose.github.io/quickpose-ios-sdk
import SwiftUI
import QuickPoseCore
import QuickPoseSwiftUI
....
struct QuickPoseBasicView: View {
private var quickPose = QuickPose(sdkKey: "YOUR SDK KEY HERE") // register for your free key at https://dev.quickpose.ai
@State private var overlayImage: UIImage?
var body: some View {
GeometryReader { geometry in
ZStack(alignment: .top) {
QuickPoseCameraView(useFrontCamera: true, delegate: quickPose)
QuickPoseOverlayView(overlayImage: $overlayImage)
}
.frame(width: geometry.size.width)
.edgesIgnoringSafeArea(.all)
.onAppear {
quickPose.start(features: [.overlay(.userLeftArm)], onFrame: { status, image, features, guidance, landmarks in
if case .success(_) = status {
overlayImage = image
}
})
}.onDisappear {
quickPose.stop()
}
}
}
}
import SwiftUI
import QuickPoseCore
import QuickPoseSwiftUI
...
struct QuickPoseBasicView: View {
private var quickPose = QuickPose(sdkKey: "YOUR SDK KEY HERE") // register for your free key at https://dev.quickpose.ai
@State private var overlayImage: UIImage?
var body: some View {
GeometryReader { geometry in
ZStack(alignment: .top) {
if ProcessInfo.processInfo.isiOSAppOnMac, let url = Bundle.main.url(forResource: "happy-dance", withExtension: "mov") {
QuickPoseSimulatedCameraView(useFrontCamera: true, delegate: quickPose, video: url)
} else {
QuickPoseCameraView(useFrontCamera: true, delegate: quickPose)
}
QuickPoseOverlayView(overlayImage: $overlayImage)
}
.frame(width: geometry.size.width)
.edgesIgnoringSafeArea(.all)
.onAppear {
quickPose.start(features: [.overlay(.upperBody)], onFrame: { status, image, features, guidance, landmarks in
if case .success(_) = status {
overlayImage = image
}
})
}.onDisappear {
quickPose.stop()
}
}
}
import QuickPoseCore
import QuickPoseCamera
...
class ViewController: UIViewController {
var camera: QuickPoseCamera?
var quickPose = QuickPose(sdkKey: "YOUR SDK KEY HERE") // register for your free key at https://dev.quickpose.ai
@IBOutlet var cameraView: UIView!
@IBOutlet var overlayView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// setup camera
camera = QuickPoseCamera(useFrontCamera: true)
try? camera?.start(delegate: quickPose)
let customPreviewLayer = AVCaptureVideoPreviewLayer(session: camera!.session!)
customPreviewLayer.videoGravity = .resizeAspectFill
customPreviewLayer.frame.size = view.frame.size
cameraView.layer.addSublayer(customPreviewLayer)
// setup overlay
overlayView.contentMode = .scaleAspectFill // keep overlays in same scale as camera output
overlayView.frame.size = view.frame.size
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
quickPose.start(features: [.overlay(.userLeftArm)], onFrame: { status, image, features, guidance, landmarks in
if case .success(_) = status {
DispatchQueue.main.async {
self.overlayView.image = image
}
}
})
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
camera?.stop()
quickPose.stop()
}
}
import QuickPoseCore
import QuickPoseCamera
...
class ViewController: UIViewController {
var camera: QuickPoseCamera?
var simulatedCamera: QuickPoseSimulatedCamera?
var quickPose = QuickPose(sdkKey: "YOUR SDK KEY HERE") // register for your free key at https://dev.quickpose.ai
@IBOutlet var cameraView: UIView!
@IBOutlet var overlayView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
if ProcessInfo.processInfo.isiOSAppOnMac, let url = Bundle.main.url(forResource: "happy-dance", withExtension: "mov") {
simulatedCamera = QuickPoseSimulatedCamera(useFrontCamera: true, asset: AVAsset(url: url)) // setup simulated camera
try? simulatedCamera?.start(delegate: quickPose)
let customPreviewLayer = AVPlayerLayer(player: simulatedCamera?.player)
customPreviewLayer.videoGravity = .resizeAspectFill
customPreviewLayer.frame.size = view.frame.size
cameraView.layer.addSublayer(customPreviewLayer)
} else {
camera = QuickPoseCamera(useFrontCamera: true) // setup camera
try? camera?.start(delegate: quickPose)
let customPreviewLayer = AVCaptureVideoPreviewLayer(session: camera!.session!)
customPreviewLayer.videoGravity = .resizeAspectFill
customPreviewLayer.frame.size = view.frame.size
cameraView.layer.addSublayer(customPreviewLayer)
}
// setup overlay
overlayView.contentMode = .scaleAspectFill // keep overlays in same scale as camera output
overlayView.frame.size = view.frame.size
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
quickPose.start(features: [.overlay(.upperBody)], onFrame: { status, image, features, guidance, landmarks in
if case .success(_) = status {
DispatchQueue.main.async {
self.overlayView.image = image
}
}
})
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
camera?.stop()
simulatedCamera?.stop()
quickPose.stop()
}
}
Xcode reports error no such module QuickPoseCore
or no such module QuickPoseSwiftUI
This happens when the linker cannot find the provided XCFrameworks. These needs to be added to your build Target.