hand_detection 3.3.0
hand_detection: ^3.3.0 copied to clipboard
Hand, gesture and landmark detection using on-device TFLite models
3.3.0 #
- Add MediaPipe-style detection + tracking: pass
enableTracking: truetoHandDetector.create/initialize/initializeFromBuffers. Each detected hand is followed frame-to-frame via a rotated region of interest derived from its own landmarks (wrist to middle-finger-MCP orientation, tight landmark box expanded 2x), and the palm detector only runs to acquire new hands or re-acquire lost ones. This removes the per-frame palm re-detection drop-outs on video and live camera (a sample origami clip went from 90% to 100% of frames with a hand at the same 0.5 thresholds). Off by default; existing behavior is unchanged. - Add
HandDetector.resetTracking()to clear the cross-frame tracking state between unrelated inputs (a new video, or independent still images). Safe to call when tracking is disabled; no-op on web. - Tracking ROIs are gated by
minLandmarkScore(keep it near 0.5 with tracking; permissive thresholds let garbage frames perpetuate) and guarded against degenerate or runaway regions, so a bad frame falls back to palm re-detection instead of drifting. - Web:
enableTrackingis accepted for cross-platform API parity (the web implementation still runs palm detection every frame). - Example app: the Live Camera and Video File screens expose a tracking toggle in their settings, off by default.
- Expose palm post-processing tuning on
HandDetector.create/initialize/initializeFromBuffers:palmNmsIou(palm non-maximum-suppression IoU) andpalmRoiScale(how much the palm box is expanded before it is cropped for the landmark model). Both were previously hardcoded (0.45 / 2.6); the defaults are unchanged. - Add
TrackingConfigto tune the cross-frame tracked ROI (roiScale,roiShiftY,associationIou,minRoiSize,maxRoiSize), passed viatrackingConfig:. These were previously hardcoded constants; the defaults port MediaPipe's hand tracking graph and are unchanged. Only takes effect whenenableTrackingis true. - Web:
palmNmsIou/palmRoiScaleare honored (they feed the shared palm post-processing), and the web palm detector now appliesdetectorConf(previously accepted but ignored).trackingConfigis accepted for API parity but ignored (web has no ROI tracking yet).
3.2.0 #
- Update flutter_litert -> 3.2.0
- Import native-only flutter_litert APIs via
package:flutter_litert/native.dartso they resolve under static analysis (flutter_litert 3.2.0 movedInterpreterPool,IsolateWorkerBase, andTensorFloat32Viewsbehind the native conditional export). No runtime or API change. - Default the public entry's conditional export to the web implementation, gating native behind
dart.library.io, restoring WASM compatibility (pub.dev WASM-ready). No behavior change on any platform. - Add
package:hand_detection/hand_detection_native.dart, a native-only entry point that re-exports the native implementation for code that runs only on native platforms.
3.1.2 #
- Update flutter_litert -> 3.1.1
3.1.1 #
- Update flutter_litert -> 2.8.3
3.1.0 #
- Update flutter_litert -> 2.8.0
- Complete Swift Package Manager migration: example apps build via SPM without CocoaPods
3.0.7 #
- Remove unused Darwin podspecs for Dart-only iOS/macOS plugin registration.
3.0.6 #
- Update flutter_litert -> 2.5.8
3.0.5 #
- Update flutter_litert -> 2.5.5
3.0.4 #
- Update flutter_litert to 2.5.3 and camera_desktop to 1.1.4
3.0.3 #
- Update flutter_litert -> 2.5.2
3.0.2 #
- Update flutter_litert -> 2.5.0
3.0.1 #
- Update flutter_litert -> 2.4.1
3.0.0 #
Breaking:
-
HandDetectorconfiguration moves from the constructor toinitialize().HandDetector({mode: ..., landmarkModel: ..., ...})→HandDetector()+await detector.initialize(mode: ..., landmarkModel: ..., ...). MatchesFaceDetector's shape.HandDetector.create({...})continues to accept the same named params unchanged. -
HandDetector.detectnow takesUint8Listinstead ofList<int>. Callers passing a plainList<int>must convert (Uint8List.fromList(...)); callers already passingUint8List(includingFile.readAsBytes()andcameraplugin bytes) are unaffected. -
detect(...)no longer swallows exceptions. Previously, malformed image bytes resolved to an empty list; now they surface as an exception. Genuine errors (StateError, isolate failures, dispose races) also propagate. Wrapdetect(...)in atry/catchif your callsite depended on the previous silent-failure behavior. -
HandDetectornow runs all TFLite inference in a dedicated background isolate automatically, keeping the UI thread free. -
Deprecate
HandDetectorIsolate: useHandDetectordirectly.HandDetectorIsolateis kept as a thin wrapper for backward compatibility and will be removed in a future release. -
Add
HandDetector.create({...})static factory for one-step construction and initialization (mirrorsFaceDetector.create). -
Add
detectFromFilepath(String path)convenience method. -
Add
detectFromMatBytes(Uint8List, {required int width, required int height, int matType})fast path: transfers raw pixel bytes to the background isolate via zero-copyTransferableTypedData, avoidingcv.Matconstruction on the calling thread. -
Rename
detectOnMattodetectFromMatanddetectOnMatBytestodetectFromMatBytesfor naming parity withface_detection_tflite; old names kept as deprecated aliases. -
Expand
flutter_litertre-exports through thehand_detectionbarrel to matchface_detection_tflite: tensor helpers (createNHWCTensor4D,fillNHWC4D,allocTensorShape,flattenDynamicTensor), math helpers (sigmoid,sigmoidClipped,clamp01,clip), letterbox helpers (computeLetterboxParams,LetterboxParams), BGR→RGB byte helpers (bgrBytesToRgbFloat32,bgrBytesToSignedFloat32), andPerformanceMode. Consumers no longer need a directflutter_litertimport for these. -
Update example app to use
HandDetector.create()instead ofHandDetectorIsolate.spawn(). -
Rewrite README's Live Camera Detection section around the shared
packYuv420+ nativecv.cvtColorpattern, and drop the "Background Isolate Detection" / "OpenCV Mat Support" sections that pointed users at the deprecatedHandDetectorIsolate.
2.1.2 #
- Add public
HandDetector.modelVersionandHandDetector.modelVersionFor(...)APIs for downstream cache invalidation.
2.1.1 #
- Fix iOS camera preview lifecycle in example
2.1.0 #
- Fix Android live camera in the example app:
- Replace the per-pixel Dart YUV→BGR loop with
flutter_litert's sharedpackYuv420helper + nativecv.cvtColor, matchingface_detection_tflite. _rotationFlagForFramenow handles all four device orientations (portrait up/down, landscape left/right) via a combinedsensorOrientation+DeviceOrientationformula. Previously only one of the two landscape directions rendered correctly; the other was 180° off.- Mirror the detection overlay on Android front camera to match
CameraPreview's auto-mirrored preview texture.
- Replace the per-pixel Dart YUV→BGR loop with
- Align example app live-camera layout with
face_detection_tflite: Material+Row top bar (replaces AppBar), flip-camera button, FPS + detection-time display, rotating top bar in landscape with safe-area padding, and a settings popup housing hand-specific controls (Max Hands slider, gesture toggle). - Re-export
packYuv420,YuvPlane,YuvLayout, andPackedYuvfromflutter_litertthrough thehand_detectionbarrel. - Update
flutter_litertto^2.2.0.
2.0.9 #
- Update flutter_litert -> 2.1.0
2.0.8 #
- Update flutter_litert to 2.0.13
2.0.7 #
- Update flutter_litert -> 2.0.12
2.0.6 #
- Update flutter_litert 2.0.10 -> 2.0.11
2.0.5 #
- Update documentation
2.0.4 #
- Update flutter_litert 2.0.8 -> 2.0.10
2.0.3 #
- Enable auto hardware acceleration by default (XNNPACK on all native platforms, Metal GPU on iOS)
- Update flutter_litert 2.0.6 -> 2.0.8
2.0.2 #
- Update flutter_litert 2.0.5 -> 2.0.6
2.0.1 #
- Fix Xcode build warnings by declaring PrivacyInfo.xcprivacy as a resource bundle in iOS and macOS podspecs
2.0.0 #
Breaking: Point now uses double coordinates. BoundingBox.toMap() format changed to corner-based.
- Use shared
PointandBoundingBoxfromflutter_litert2.0.0 toPixel()now returns full-precisiondoublecoordinates (was truncating toint)- Remove duplicate NMS implementation, use shared
nms()fromflutter_litert - Refactor isolate worker to use
IsolateWorkerBasefrom flutter_litert - Simplify model classes (PalmDetector, HandLandmarkModel, GestureRecognizer)
- Remove integration tests from unit test suite
- Remove dead test helpers (
test_config.dart)
1.0.3 #
- Update
camera_desktop1.0.1 -> 1.0.3
1.0.2 #
- Update
flutter_litert-> 1.2.0 - Refactor to use
flutter_litertshared utilities (InterpreterFactory,InterpreterPool,PerformanceConfig,generateAnchors)
1.0.1 #
- Update
opencv_dart2.1.0 -> 2.2.1 - Update
flutter_litert1.0.2 -> 1.0.3
1.0.0 #
First stable release of hand_detection
Pipeline #
- Palm detection, SSD model with rotation-aware bounding boxes
- Hand landmarks, 21-point 3D landmarks with visibility scores
- Gesture recognition, 7 gestures (fist, open palm, pointing up, thumbs down/up, victory, I love you)
- Handedness, Left/right classification
Features #
- Two modes:
HandMode.boxes(bounding boxes only) andHandMode.boxesAndLandmarks(full landmarks) HandDetectorIsolatefor background-thread inference with zero-copy transfer- Direct
cv.Matinput for live camera processing - XNNPACK hardware acceleration with configurable thread count
- Configurable confidence thresholds and detection limits
Platforms #
- iOS, Android, macOS, Windows, Linux
0.0.4 #
- Update documentation
0.0.3 #
- Update
flutter_litertto 1.0.1,camerato 0.12.0
0.0.2 #
- Update
flutter_litertto 0.2.2
0.0.1 #
- Initial release