diff --git a/src/Tizen.Multimedia.Vision/Interop/Interop.Libraries.cs b/src/Tizen.Multimedia.Vision/Interop/Interop.Libraries.cs index 3a22309b08f..647eac18612 100644 --- a/src/Tizen.Multimedia.Vision/Interop/Interop.Libraries.cs +++ b/src/Tizen.Multimedia.Vision/Interop/Interop.Libraries.cs @@ -20,12 +20,17 @@ internal static partial class Libraries { public const string MediaVisionCommon = "libmv_common.so"; public const string MediaVisionFace = "libmv_face.so"; - public const string MediaVisionInference = "libmv_inference.so"; public const string MediaVisionImage = "libmv_image.so"; public const string MediaVisionSurveillance = "libmv_surveillance.so"; public const string MediaVisionBarcodeDetector = "libmv_barcode_detector.so"; public const string MediaVisionBarcodeGenerator = "libmv_barcode_generator.so"; public const string MediaVisionRoiTracker = "libmv_roi_tracker.so"; public const string MediaVisionFaceRecognition = "libmv_face_recognition.so"; // It's based on machine learning + public const string MediaVisionInference = "libmv_inference.so"; + public const string MediaVisionInferenceImageClassification = "libmv_image_classification.so"; // Inference image classification + public const string MediaVisionInferenceObjectDetection = "libmv_object_detection.so"; + public const string MediaVisionInferenceFaceDetection = MediaVisionInferenceObjectDetection; // Inference object detection and face detection + public const string MediaVisionInferenceFacialLandmarkDetection = "libmv_landmark_detection.so"; + public const string MediaVisionInferencePoseLandmarkDetection = "libmv_landmark_detection.so"; // Inference facial landmark detection and pose landmark detection } } diff --git a/src/Tizen.Multimedia.Vision/Interop/Interop.MediaVision.Inference.cs b/src/Tizen.Multimedia.Vision/Interop/Interop.MediaVision.Inference.cs index 2e5d9879231..dbd93354e86 100644 --- a/src/Tizen.Multimedia.Vision/Interop/Interop.MediaVision.Inference.cs +++ b/src/Tizen.Multimedia.Vision/Interop/Interop.MediaVision.Inference.cs @@ -112,5 +112,145 @@ internal static extern MediaVisionError DetectFacialLandmark(IntPtr source, IntP internal static extern MediaVisionError DetectPoseLandmark(IntPtr source, IntPtr inference, IntPtr roi, PoseLandmarkDetectedCallback callback, IntPtr userData = default(IntPtr)); // Deprecated in API 12 } + + internal static partial class InferenceImageClassification + { + // Newly added inferernce APIs + [DllImport(Libraries.MediaVisionInferenceImageClassification, EntryPoint = "mv_image_classification_create")] + internal static extern MediaVisionError Create(out IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceImageClassification, EntryPoint = "mv_image_classification_destroy")] + internal static extern MediaVisionError Destroy(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceImageClassification, EntryPoint = "mv_image_classification_configure")] + internal static extern MediaVisionError Configure(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceImageClassification, EntryPoint = "mv_image_classification_prepare")] + internal static extern MediaVisionError Prepare(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceImageClassification, EntryPoint = "mv_image_classification_inference")] + internal static extern MediaVisionError Inference(IntPtr handle, IntPtr source); + + [DllImport(Libraries.MediaVisionInferenceImageClassification, EntryPoint = "mv_image_classification_inference_async")] + internal static extern MediaVisionError InferenceAsync(IntPtr handle, IntPtr source); + + [DllImport(Libraries.MediaVisionInferenceImageClassification, EntryPoint = "mv_image_classification_get_result_count")] + internal static extern MediaVisionError GetResultCount(IntPtr handle, out ulong requestOrder, out uint count); + + [DllImport(Libraries.MediaVisionInferenceImageClassification, EntryPoint = "mv_image_classification_get_label")] + internal static extern MediaVisionError GetLabels(IntPtr handle, uint index, out IntPtr label); + } + + internal static partial class InferenceFaceDetection + { + // Newly added inferernce APIs + [DllImport(Libraries.MediaVisionInferenceFaceDetection, EntryPoint = "mv_face_detection_create")] + internal static extern MediaVisionError Create(out IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceFaceDetection, EntryPoint = "mv_face_detection_destroy")] + internal static extern MediaVisionError Destroy(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceFaceDetection, EntryPoint = "mv_face_detection_configure")] + internal static extern MediaVisionError Configure(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceFaceDetection, EntryPoint = "mv_face_detection_prepare")] + internal static extern MediaVisionError Prepare(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceFaceDetection, EntryPoint = "mv_face_detection_inference")] + internal static extern MediaVisionError Inference(IntPtr handle, IntPtr source); + + [DllImport(Libraries.MediaVisionInferenceFaceDetection, EntryPoint = "mv_face_detection_inference_async")] + internal static extern MediaVisionError InferenceAsync(IntPtr handle, IntPtr source); + + [DllImport(Libraries.MediaVisionInferenceFaceDetection, EntryPoint = "mv_face_detection_get_result_count")] + internal static extern MediaVisionError GetResultCount(IntPtr handle, out ulong requestId, out uint count); + + [DllImport(Libraries.MediaVisionInferenceFaceDetection, EntryPoint = "mv_face_detection_get_bound_box")] + internal static extern MediaVisionError GetBoundingBoxes(IntPtr handle, uint index, out int left, out int top, out int right, out int bottom); + } + + internal static partial class InferenceObjectDetection + { + // Newly added inferernce APIs + [DllImport(Libraries.MediaVisionInferenceObjectDetection, EntryPoint = "mv_object_detection_create")] + internal static extern MediaVisionError Create(out IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceObjectDetection, EntryPoint = "mv_object_detection_destroy")] + internal static extern MediaVisionError Destroy(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceObjectDetection, EntryPoint = "mv_object_detection_configure")] + internal static extern MediaVisionError Configure(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceObjectDetection, EntryPoint = "mv_object_detection_prepare")] + internal static extern MediaVisionError Prepare(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceObjectDetection, EntryPoint = "mv_object_detection_inference")] + internal static extern MediaVisionError Inference(IntPtr handle, IntPtr source); + + [DllImport(Libraries.MediaVisionInferenceObjectDetection, EntryPoint = "mv_object_detection_inference_async")] + internal static extern MediaVisionError InferenceAsync(IntPtr handle, IntPtr source); + + [DllImport(Libraries.MediaVisionInferenceObjectDetection, EntryPoint = "mv_object_detection_get_result_count")] + internal static extern MediaVisionError GetResultCount(IntPtr handle, out ulong requestId, out uint count); + + [DllImport(Libraries.MediaVisionInferenceObjectDetection, EntryPoint = "mv_object_detection_get_bound_box")] + internal static extern MediaVisionError GetBoundingBoxes(IntPtr handle, uint index, out int left, out int top, out int right, out int bottom); + } + + internal static partial class InferenceFacialLandmarkDetection + { + // Newly added inferernce APIs + [DllImport(Libraries.MediaVisionInferenceFacialLandmarkDetection, EntryPoint = "mv_facial_landmark_create")] + internal static extern MediaVisionError Create(out IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceFacialLandmarkDetection, EntryPoint = "mv_facial_landmark_destroy")] + internal static extern MediaVisionError Destroy(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceFacialLandmarkDetection, EntryPoint = "mv_facial_landmark_configure")] + internal static extern MediaVisionError Configure(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceFacialLandmarkDetection, EntryPoint = "mv_facial_landmark_prepare")] + internal static extern MediaVisionError Prepare(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferenceFacialLandmarkDetection, EntryPoint = "mv_facial_landmark_inference")] + internal static extern MediaVisionError Inference(IntPtr handle, IntPtr source); + + [DllImport(Libraries.MediaVisionInferenceFacialLandmarkDetection, EntryPoint = "mv_facial_landmark_inference_async")] + internal static extern MediaVisionError InferenceAsync(IntPtr handle, IntPtr source); + + [DllImport(Libraries.MediaVisionInferenceFacialLandmarkDetection, EntryPoint = "mv_facial_landmark_get_result_count")] + internal static extern MediaVisionError GetResultCount(IntPtr handle, out ulong requestId, out uint count); + + [DllImport(Libraries.MediaVisionInferenceFacialLandmarkDetection, EntryPoint = "mv_facial_landmark_get_position")] + internal static extern MediaVisionError GetPoints(IntPtr handle, uint index, out uint posX, out uint posY); + } + + internal static partial class InferencePoseLandmarkDetection + { + // Newly added inferernce APIs + [DllImport(Libraries.MediaVisionInferencePoseLandmarkDetection, EntryPoint = "mv_pose_landmark_create")] + internal static extern MediaVisionError Create(out IntPtr handle); + + [DllImport(Libraries.MediaVisionInferencePoseLandmarkDetection, EntryPoint = "mv_pose_landmark_destroy")] + internal static extern MediaVisionError Destroy(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferencePoseLandmarkDetection, EntryPoint = "mv_pose_landmark_configure")] + internal static extern MediaVisionError Configure(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferencePoseLandmarkDetection, EntryPoint = "mv_pose_landmark_prepare")] + internal static extern MediaVisionError Prepare(IntPtr handle); + + [DllImport(Libraries.MediaVisionInferencePoseLandmarkDetection, EntryPoint = "mv_pose_landmark_inference")] + internal static extern MediaVisionError Inference(IntPtr handle, IntPtr source); + + [DllImport(Libraries.MediaVisionInferencePoseLandmarkDetection, EntryPoint = "mv_pose_landmark_inference_async")] + internal static extern MediaVisionError InferenceAsync(IntPtr handle, IntPtr source); + + [DllImport(Libraries.MediaVisionInferencePoseLandmarkDetection, EntryPoint = "mv_pose_landmark_get_result_count")] + internal static extern MediaVisionError GetResultCount(IntPtr handle, out ulong requestId, out uint count); + + [DllImport(Libraries.MediaVisionInferencePoseLandmarkDetection, EntryPoint = "mv_pose_landmark_get_position")] + internal static extern MediaVisionError GetPoints(IntPtr handle, uint index, out uint posX, out uint posY); + } } } diff --git a/src/Tizen.Multimedia.Vision/MediaVision/InferenceFaceDetector.cs b/src/Tizen.Multimedia.Vision/MediaVision/InferenceFaceDetector.cs new file mode 100644 index 00000000000..a5fede9d8c8 --- /dev/null +++ b/src/Tizen.Multimedia.Vision/MediaVision/InferenceFaceDetector.cs @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Threading; +using System.Threading.Tasks; +using InteropFD = Interop.MediaVision.InferenceFaceDetection; + +namespace Tizen.Multimedia.Vision +{ + /// + /// Provides the ability to detect faces. + /// + /// http://tizen.org/feature/vision.inference + /// http://tizen.org/feature/vision.inference.face + /// 12 + public class InferenceFaceDetector : IDisposable + { + private IntPtr _handle; + private bool _disposed; + + /// Initializes a new instance of the class. + /// The required features are not supported. + /// 12 + public InferenceFaceDetector() + { + ValidationUtil.ValidateFeatureSupported(VisionFeatures.Inference); + ValidationUtil.ValidateFeatureSupported(VisionFeatures.InferenceFace); + + InteropFD.Create(out _handle).Validate("Failed to create inference face detector."); + + try + { + InteropFD.Configure(_handle).Validate("Failed to configure inference face detector."); + InteropFD.Prepare(_handle).Validate("Failed to prepare inference face detector."); + } + catch (Exception e) + { + Log.Error(MediaVisionLog.Tag, e.ToString()); + InteropFD.Destroy(_handle); + throw; + } + } + + /// + /// Finalizes an instance of the InferenceFaceDetector class. + /// + ~InferenceFaceDetector() + { + Dispose(false); + } + + /// + /// Detects faces on the source image synchronously. + /// + /// + /// can be empty, if there's no detected face. + /// + /// The image data to detect faces. + /// The BoundingBoxes of detected face. + /// The InferenceFaceDetector already has been disposed. + /// is null. + /// 12 + public InferenceFaceDetectorResult Inference(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropFD.Inference(_handle, source.Handle).Validate("Failed to inference face detection."); + + return new InferenceFaceDetectorResult(_handle); + } + + /// + /// Detects faces on the source image asynchronously. + /// + /// + /// can be empty, if there's no detected face.
+ /// This method uses about twice as much memory as . + ///
+ /// The image data to detect faces. + /// The InferenceFaceDetector already has been disposed. + /// is null. + /// 12 + public async Task InferenceAsync(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropFD.InferenceAsync(_handle, source.Handle).Validate("Failed to inference face detection."); + + return await Task.Factory.StartNew(() => new InferenceFaceDetectorResult(_handle), + CancellationToken.None, + TaskCreationOptions.DenyChildAttach | TaskCreationOptions.LongRunning, + TaskScheduler.Default); + } + + private ulong _requestId = 1; + /// + /// Requests detecting faces to get their bounding boxes asynchronously. + /// + /// + /// This function does not guarantee that inference is done when this method returns. The user can get the result by using .
+ /// If the user calls this method again before the previous one is finished internally, the call will be ignored.
+ /// can be empty, if there's no detected face.
+ /// Note that this method could use about twice as much memory as . + ///
+ /// The image data to detect faces. + /// The request ID that indicates the order of requests. + /// The InferenceFaceDetector already has been disposed. + /// is null. + /// + /// 12 + public ulong RequestInference(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropFD.InferenceAsync(_handle, source.Handle).Validate("Failed to inference face detection."); + + return _requestId++; + } + + /// + /// Gets the bounding boxes as a result of . + /// + /// + /// If there's no detected face, will be empty.
+ /// This method uses about twice as much memory as . + ///
+ /// The bounding boxes of detected face. + /// The InferenceFaceDetector already has been disposed. + /// + /// 12 + public InferenceFaceDetectorResult GetRequestResults() + { + return new InferenceFaceDetectorResult(_handle); + } + + /// + /// Releases the unmanaged resources used by the InferenceFaceDetector. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + /// 12 + protected virtual void Dispose(bool disposing) + { + if (!_disposed) + { + if (disposing) + { + // to be used if there are any other disposable objects + } + + if (_handle != IntPtr.Zero) + { + InteropFD.Destroy(_handle); + _handle = IntPtr.Zero; + } + + _disposed = true; + } + } + + /// + /// Releases all resources used by the InferenceFaceDetector. + /// + /// 12 + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + internal void ValidateNotDisposed() + { + if (_disposed) + { + Log.Error(MediaVisionLog.Tag, "InferenceFaceDetector handle is disposed."); + throw new ObjectDisposedException(nameof(InferenceFaceDetector)); + } + } + } +} \ No newline at end of file diff --git a/src/Tizen.Multimedia.Vision/MediaVision/InferenceFaceDetectorResult.cs b/src/Tizen.Multimedia.Vision/MediaVision/InferenceFaceDetectorResult.cs new file mode 100755 index 00000000000..7050d37226c --- /dev/null +++ b/src/Tizen.Multimedia.Vision/MediaVision/InferenceFaceDetectorResult.cs @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using InteropFD = Interop.MediaVision.InferenceFaceDetection; + +namespace Tizen.Multimedia.Vision +{ + /// + /// Represents the result of operations. + /// + /// 12 + public class InferenceFaceDetectorResult + { + internal InferenceFaceDetectorResult(IntPtr handle) + { + InteropFD.GetResultCount(handle, out ulong requestId, out uint count). + Validate("Failed to get result count."); + + RequestId = requestId; + var boundingBoxes = new List(); + + for (uint i = 0 ; i < count ; i++) + { + InteropFD.GetBoundingBoxes(handle, i, out int left, out int top, out int right, out int bottom). + Validate("Failed to get bounding boxes."); + boundingBoxes.Add(new Rectangle(left, top, right - left, bottom - top)); + } + + BoundingBoxes = boundingBoxes; + } + + /// + /// Gets the request ID which is matched with request ID of RequestInference() return value.
+ /// It represents the order of request. + ///
+ /// The request ID that indicates the order of request. + /// 12 + public ulong RequestId { get; } + + /// + /// Gets the bounding boxes of the detected face. + /// + /// 12 + public IEnumerable BoundingBoxes { get; } + } +} diff --git a/src/Tizen.Multimedia.Vision/MediaVision/InferenceFacialLandmarkDetector.cs b/src/Tizen.Multimedia.Vision/MediaVision/InferenceFacialLandmarkDetector.cs new file mode 100644 index 00000000000..a963a62199b --- /dev/null +++ b/src/Tizen.Multimedia.Vision/MediaVision/InferenceFacialLandmarkDetector.cs @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Threading; +using System.Threading.Tasks; +using InteropFLD = Interop.MediaVision.InferenceFacialLandmarkDetection; + +namespace Tizen.Multimedia.Vision +{ + /// + /// Provides the ability to detect facial landmarks. + /// + /// http://tizen.org/feature/vision.inference + /// http://tizen.org/feature/vision.inference.face + /// 12 + public class InferenceFacialLandmarkDetector : IDisposable + { + private IntPtr _handle; + private bool _disposed; + + /// Initializes a new instance of the class. + /// The required features are not supported. + /// 12 + public InferenceFacialLandmarkDetector() + { + ValidationUtil.ValidateFeatureSupported(VisionFeatures.Inference); + ValidationUtil.ValidateFeatureSupported(VisionFeatures.InferenceFace); + + InteropFLD.Create(out _handle).Validate("Failed to create inference facial landmark detector."); + + try + { + InteropFLD.Configure(_handle).Validate("Failed to configure inference facial landmark detector."); + InteropFLD.Prepare(_handle).Validate("Failed to prepare inference facial landmark detector."); + } + catch (Exception e) + { + Log.Error(MediaVisionLog.Tag, e.ToString()); + InteropFLD.Destroy(_handle); + throw; + } + } + + /// + /// Finalizes an instance of the InferenceFacialLandmarkDetector class. + /// + ~InferenceFacialLandmarkDetector() + { + Dispose(false); + } + + /// + /// Detects facial landmarks on the source image synchronously. + /// + /// + /// can be empty, if there's no detected facial landmark. + /// + /// The image data to detect facial landmarks. + /// The coordinates of detected facial landmarks. + /// The InferenceFacialLandmarkDetector already has been disposed. + /// is null. + /// 12 + public InferenceFacialLandmarkDetectorResult Inference(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropFLD.Inference(_handle, source.Handle).Validate("Failed to inference facial landmark detection."); + + return new InferenceFacialLandmarkDetectorResult(_handle); + } + + /// + /// Detects facial landmarks on the source image asynchronously. + /// + /// + /// can be empty, if there's no detected facial landmark.
+ /// This method uses about twice as much memory as . + ///
+ /// The image data to detect facial landmarks. + /// The InferenceFacialLandmarkDetector already has been disposed. + /// is null. + /// 12 + public async Task InferenceAsync(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropFLD.InferenceAsync(_handle, source.Handle).Validate("Failed to inference facial landmark detection."); + + return await Task.Factory.StartNew(() => new InferenceFacialLandmarkDetectorResult(_handle), + CancellationToken.None, + TaskCreationOptions.DenyChildAttach | TaskCreationOptions.LongRunning, + TaskScheduler.Default); + } + + private ulong _requestId = 1; + /// + /// Requests detecting facial landmarks to get their points asynchronously. + /// + /// + /// This function does not guarantee that inference is done when this method returns. The user can get the result by using .
+ /// If the user calls this method again before the previous one is finished internally, the call will be ignored.
+ /// can be empty, if there's no detected facial landmark.
+ /// Note that this method could use about twice as much memory as . + ///
+ /// The image data to detect facial landmarks. + /// The request ID that indicates the order of requests. + /// The InferenceFacialLandmarkDetector already has been disposed. + /// is null. + /// + /// 12 + public ulong RequestInference(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropFLD.InferenceAsync(_handle, source.Handle).Validate("Failed to inference facial landmark detection."); + return _requestId++; + } + + /// + /// Gets the points as a result of . + /// + /// + /// If there's no detected facial landmark, will be empty.
+ /// This method uses about twice as much memory as . + ///
+ /// The points of detected facial landmarks. + /// The InferenceFacialLandmarkDetector already has been disposed. + /// + /// 12 + public InferenceFacialLandmarkDetectorResult GetRequestResults() + { + return new InferenceFacialLandmarkDetectorResult(_handle); + } + + /// + /// Releases the unmanaged resources used by the InferenceFacialLandmarkDetector. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + /// 12 + protected virtual void Dispose(bool disposing) + { + if (!_disposed) + { + if (disposing) + { + // to be used if there are any other disposable objects + } + + if (_handle != IntPtr.Zero) + { + InteropFLD.Destroy(_handle); + _handle = IntPtr.Zero; + } + + _disposed = true; + } + } + + /// + /// Releases all resources used by the InferenceFacialLandmarkDetector. + /// + /// 12 + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + internal void ValidateNotDisposed() + { + if (_disposed) + { + Log.Error(MediaVisionLog.Tag, "InferenceFacialLandmarkDetector handle is disposed."); + throw new ObjectDisposedException(nameof(InferenceFacialLandmarkDetector)); + } + } + } +} \ No newline at end of file diff --git a/src/Tizen.Multimedia.Vision/MediaVision/InferenceFacialLandmarkDetectorResult.cs b/src/Tizen.Multimedia.Vision/MediaVision/InferenceFacialLandmarkDetectorResult.cs new file mode 100755 index 00000000000..67b7b752ac8 --- /dev/null +++ b/src/Tizen.Multimedia.Vision/MediaVision/InferenceFacialLandmarkDetectorResult.cs @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using InteropFLD = Interop.MediaVision.InferenceFacialLandmarkDetection; + + +namespace Tizen.Multimedia.Vision +{ + /// + /// Represents the result of operations. + /// + /// 12 + public class InferenceFacialLandmarkDetectorResult + { + internal InferenceFacialLandmarkDetectorResult(IntPtr handle) + { + InteropFLD.GetResultCount(handle, out ulong requestId, out uint count). + Validate("Failed to get result count."); + + RequestId = requestId; + var points = new List(); + + for (uint i = 0 ; i < count ; i++) + { + InteropFLD.GetPoints(handle, i, out uint x, out uint y).Validate("Failed to get points."); + points.Add(new Point((int)x, (int)y)); + } + + Points = points; + } + + /// + /// Gets the request ID which is matched with request ID of RequestInference() return value.
+ /// It represents the order of request. + ///
+ /// The request ID that indicates the order of request. + /// 12 + public ulong RequestId { get; } + + /// + /// Gets The coordinates of detected facial landmarks. + /// + /// 12 + public IEnumerable Points { get; } + } +} diff --git a/src/Tizen.Multimedia.Vision/MediaVision/InferenceImageClassifier.cs b/src/Tizen.Multimedia.Vision/MediaVision/InferenceImageClassifier.cs new file mode 100644 index 00000000000..57b7db8dceb --- /dev/null +++ b/src/Tizen.Multimedia.Vision/MediaVision/InferenceImageClassifier.cs @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Threading; +using System.Threading.Tasks; +using InteropIC = Interop.MediaVision.InferenceImageClassification; + +namespace Tizen.Multimedia.Vision +{ + /// + /// Provides the ability to classify image. + /// + /// http://tizen.org/feature/vision.inference + /// http://tizen.org/feature/vision.inference.image + /// 12 + public class InferenceImageClassifier : IDisposable + { + private IntPtr _handle; + private bool _disposed; + + /// Initializes a new instance of the class. + /// The required features are not supported. + /// 12 + public InferenceImageClassifier() + { + ValidationUtil.ValidateFeatureSupported(VisionFeatures.Inference); + ValidationUtil.ValidateFeatureSupported(VisionFeatures.InferenceImage); + + InteropIC.Create(out _handle).Validate("Failed to create inference image classifier."); + + try + { + InteropIC.Configure(_handle).Validate("Failed to configure inference image classifier."); + InteropIC.Prepare(_handle).Validate("Failed to prepare inference image classifier."); + } + catch (Exception e) + { + Log.Error(MediaVisionLog.Tag, e.ToString()); + InteropIC.Destroy(_handle); + throw; + } + } + + /// + /// Finalizes an instance of the InferenceImageClassifier class. + /// + ~InferenceImageClassifier() + { + Dispose(false); + } + + /// + /// Classifies image synchronously. + /// + /// + /// can be empty, if image is not classified. + /// + /// The image data to classify. + /// The labels of classified image. + /// The InferenceImageClassifier already has been disposed. + /// is null. + /// 12 + public InferenceImageClassifierResult Inference(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropIC.Inference(_handle, source.Handle).Validate("Failed to inference image classification"); + + return new InferenceImageClassifierResult(_handle); + } + + /// + /// Classifies image asynchronously. + /// + /// + /// can be empty, if image is not classified.
+ /// This method uses about twice as much memory as . + ///
+ /// The image data to classify. + /// The InferenceImageClassifier already has been disposed. + /// is null. + /// 12 + public async Task InferenceAsync(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropIC.InferenceAsync(_handle, source.Handle).Validate("Failed to inference image classification"); + + return await Task.Factory.StartNew(() => new InferenceImageClassifierResult(_handle), + CancellationToken.None, + TaskCreationOptions.DenyChildAttach | TaskCreationOptions.LongRunning, + TaskScheduler.Default); + } + + private ulong _requestId = 1; + /// + /// Requests classifing image to get its labels asynchronously. + /// + /// + /// This function does not guarantee that inference is done when this method returns. The user can get the result by using .
+ /// If the user calls this method again before the previous one is finished internally, the call will be ignored.
+ /// can be empty, if image is not classified.
+ /// Note that this method could use about twice as much memory as . + ///
+ /// The image data to classify. + /// The request ID that indicates the order of requests. + /// The InferenceImageClassifier already has been disposed. + /// is null. + /// + /// 12 + public ulong RequestInference(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropIC.InferenceAsync(_handle, source.Handle).Validate("Failed to inference image classification."); + + return _requestId++; + } + + /// + /// Gets the labels as a result of . + /// + /// + /// If image is not classified, will be empty.
+ /// This method uses about twice as much memory as . + ///
+ /// The labels of classified image. + /// The InferenceImageClassifier already has been disposed. + /// + /// 12 + public InferenceImageClassifierResult GetRequestResults() + { + return new InferenceImageClassifierResult(_handle); + } + + /// + /// Releases the unmanaged resources used by the InferenceImageClassifier. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + /// 12 + protected virtual void Dispose(bool disposing) + { + if (!_disposed) + { + if (disposing) + { + // to be used if there are any other disposable objects + } + + if (_handle != IntPtr.Zero) + { + InteropIC.Destroy(_handle); + _handle = IntPtr.Zero; + } + + _disposed = true; + } + } + + /// + /// Releases all resources used by the InferenceImageClassifier. + /// + /// 12 + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + internal void ValidateNotDisposed() + { + if (_disposed) + { + Log.Error(MediaVisionLog.Tag, "InferenceImageClassifier handle is disposed."); + throw new ObjectDisposedException(nameof(InferenceImageClassifier)); + } + } + } +} \ No newline at end of file diff --git a/src/Tizen.Multimedia.Vision/MediaVision/InferenceImageClassifierResult.cs b/src/Tizen.Multimedia.Vision/MediaVision/InferenceImageClassifierResult.cs new file mode 100755 index 00000000000..70b59184c68 --- /dev/null +++ b/src/Tizen.Multimedia.Vision/MediaVision/InferenceImageClassifierResult.cs @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using InteropIC = Interop.MediaVision.InferenceImageClassification; + +namespace Tizen.Multimedia.Vision +{ + /// + /// Represents the result of operations. + /// + /// 12 + public class InferenceImageClassifierResult + { + internal InferenceImageClassifierResult(IntPtr handle) + { + InteropIC.GetResultCount(handle, out ulong requestId, out uint count). + Validate("Failed to get result count."); + + RequestId = requestId; + var labels = new List(); + + for (uint i = 0 ; i < count ; i++) + { + InteropIC.GetLabels(handle, i, out IntPtr label).Validate("Failed to get labels."); + labels.Add(Marshal.PtrToStringAnsi(label)); + } + + Labels = labels; + } + + /// + /// Gets the request ID which is matched with request ID of RequestInference() return value.
+ /// It represents the order of request. + ///
+ /// The request ID that indicates the order of request. + /// 12 + public ulong RequestId { get; } + + /// + /// Gets the labels of the classified image. + /// + /// 12 + public IEnumerable Labels { get; } + } +} diff --git a/src/Tizen.Multimedia.Vision/MediaVision/InferenceObjectDetector.cs b/src/Tizen.Multimedia.Vision/MediaVision/InferenceObjectDetector.cs new file mode 100644 index 00000000000..3945e79a657 --- /dev/null +++ b/src/Tizen.Multimedia.Vision/MediaVision/InferenceObjectDetector.cs @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Threading; +using System.Threading.Tasks; +using InteropOD = Interop.MediaVision.InferenceObjectDetection; + +namespace Tizen.Multimedia.Vision +{ + /// + /// Provides the ability to detect object. + /// + /// http://tizen.org/feature/vision.inference + /// http://tizen.org/feature/vision.inference.image + /// 12 + public class InferenceObjectDetector : IDisposable + { + private IntPtr _handle; + private bool _disposed; + + /// Initializes a new instance of the class. + /// The required features are not supported. + /// 12 + public InferenceObjectDetector() + { + ValidationUtil.ValidateFeatureSupported(VisionFeatures.Inference); + ValidationUtil.ValidateFeatureSupported(VisionFeatures.InferenceImage); + + InteropOD.Create(out _handle).Validate("Failed to create inference object detector."); + + try + { + InteropOD.Configure(_handle).Validate("Failed to configure inference object detector."); + InteropOD.Prepare(_handle).Validate("Failed to prepare inference object detector."); + } + catch (Exception e) + { + Log.Error(MediaVisionLog.Tag, e.ToString()); + InteropOD.Destroy(_handle); + throw; + } + } + + /// + /// Finalizes an instance of the InferenceObjectDetector class. + /// + ~InferenceObjectDetector() + { + Dispose(false); + } + + /// + /// Detects objects on the source image synchronously. + /// + /// + /// can be empty, if there's no detected object. + /// + /// The image data to detect object. + /// BoundingBoxes of detected object. + /// The InferenceObjectDetector already has been disposed. + /// is null. + /// 12 + public InferenceObjectDetectorResult Inference(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropOD.Inference(_handle, source.Handle).Validate("Failed to inference object detection."); + + return new InferenceObjectDetectorResult(_handle); + } + + /// + /// Detects objects on the source image asynchronously. + /// + /// + /// can be empty, if there's no detected object.
+ /// This method uses about twice as much memory as . + ///
+ /// The image data to detect object. + /// The InferenceObjectDetector already has been disposed. + /// is null. + /// 12 + public async Task InferenceAsync(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropOD.InferenceAsync(_handle, source.Handle).Validate("Failed to inference object detection."); + + return await Task.Factory.StartNew(() => new InferenceObjectDetectorResult(_handle), + CancellationToken.None, + TaskCreationOptions.DenyChildAttach | TaskCreationOptions.LongRunning, + TaskScheduler.Default); + } + + private ulong _requestId = 1; + /// + /// Requests detecting objects to get their bounding boxes asynchronously. + /// + /// + /// This function does not guarantee that inference is done when this method returns. The user can get the result by using .
+ /// If the user calls this method again before the previous one is finished internally, the call will be ignored.
+ /// can be empty, if there's no detected object.
+ /// Note that this method could use about twice as much memory as . + ///
+ /// The image data to detect object. + /// The request ID that indicates the order of requests. + /// The InferenceObjectDetector already has been disposed. + /// is null. + /// + /// 12 + public ulong RequestInference(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropOD.InferenceAsync(_handle, source.Handle).Validate("Failed to inference object detection."); + + return _requestId++; + } + + /// + /// Gets the bounding boxes as a result of . + /// + /// + /// If there's no detected object, will be empty.
+ /// This method uses about twice as much memory as . + ///
+ /// The bounding boxes of detected object. + /// The InferenceObjectDetector already has been disposed. + /// + /// 12 + public InferenceObjectDetectorResult GetRequestResults() + { + return new InferenceObjectDetectorResult(_handle); + } + + /// + /// Releases the unmanaged resources used by the InferenceObjectDetector. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + /// 12 + protected virtual void Dispose(bool disposing) + { + if (!_disposed) + { + if (disposing) + { + // to be used if there are any other disposable objects + } + + if (_handle != IntPtr.Zero) + { + InteropOD.Destroy(_handle); + _handle = IntPtr.Zero; + } + + _disposed = true; + } + } + + /// + /// Releases all resources used by the InferenceObjectDetector. + /// + /// 12 + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + internal void ValidateNotDisposed() + { + if (_disposed) + { + Log.Error(MediaVisionLog.Tag, "InferenceObjectDetector handle is disposed."); + throw new ObjectDisposedException(nameof(InferenceObjectDetector)); + } + } + } +} \ No newline at end of file diff --git a/src/Tizen.Multimedia.Vision/MediaVision/InferenceObjectDetectorResult.cs b/src/Tizen.Multimedia.Vision/MediaVision/InferenceObjectDetectorResult.cs new file mode 100755 index 00000000000..090031aa46a --- /dev/null +++ b/src/Tizen.Multimedia.Vision/MediaVision/InferenceObjectDetectorResult.cs @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using InteropOD = Interop.MediaVision.InferenceObjectDetection; + +namespace Tizen.Multimedia.Vision +{ + /// + /// Represents the result of operations. + /// + /// 12 + public class InferenceObjectDetectorResult + { + internal InferenceObjectDetectorResult(IntPtr handle) + { + InteropOD.GetResultCount(handle, out ulong requestId, out uint count). + Validate("Failed to get result count."); + + RequestId = requestId; + var boundingBoxes = new List(); + + for (uint i = 0 ; i < count ; i++) + { + InteropOD.GetBoundingBoxes(handle, i, out int left, out int top, out int right, out int bottom). + Validate("Failed to get bounding boxes."); + boundingBoxes.Add(new Rectangle(left, top, right - left, bottom - top)); + } + + BoundingBoxes = boundingBoxes; + } + + /// + /// Gets the request ID which is matched with request ID of RequestInference() return value.
+ /// It represents the order of request. + ///
+ /// The request ID that indicates the order of request. + /// 12 + public ulong RequestId { get; } + + /// + /// Gets the bounding boxes of the detected object. + /// + /// 12 + public IEnumerable BoundingBoxes { get; } + } +} diff --git a/src/Tizen.Multimedia.Vision/MediaVision/InferencePoseLandmarkDetector.cs b/src/Tizen.Multimedia.Vision/MediaVision/InferencePoseLandmarkDetector.cs new file mode 100644 index 00000000000..a16a3f67474 --- /dev/null +++ b/src/Tizen.Multimedia.Vision/MediaVision/InferencePoseLandmarkDetector.cs @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Threading; +using System.Threading.Tasks; +using InteropPLD = Interop.MediaVision.InferencePoseLandmarkDetection; + +namespace Tizen.Multimedia.Vision +{ + /// + /// Provides the ability to detect pose landmark. + /// + /// http://tizen.org/feature/vision.inference + /// http://tizen.org/feature/vision.inference.face + /// 12 + public class InferencePoseLandmarkDetector : IDisposable + { + private IntPtr _handle; + private bool _disposed; + + /// Initializes a new instance of the class. + /// The required features are not supported. + /// 12 + public InferencePoseLandmarkDetector() + { + ValidationUtil.ValidateFeatureSupported(VisionFeatures.Inference); + ValidationUtil.ValidateFeatureSupported(VisionFeatures.InferenceFace); + + InteropPLD.Create(out _handle).Validate("Failed to create inference pose landmark detector."); + + try + { + InteropPLD.Configure(_handle).Validate("Failed to configure inference pose landmark detector."); + InteropPLD.Prepare(_handle).Validate("Failed to prepare inference pose landmark detector."); + } + catch (Exception e) + { + Log.Error(MediaVisionLog.Tag, e.ToString()); + InteropPLD.Destroy(_handle); + throw; + } + } + + /// + /// Finalizes an instance of the InferencePoseLandmarkDetector class. + /// + ~InferencePoseLandmarkDetector() + { + Dispose(false); + } + + /// + /// Detects pose landmarks on the source image synchronously. + /// + /// + /// can be empty, if there's no detected pose landmark. + /// + /// The image data to detect pose landmark. + /// The coordinates of detected pose landmarks. + /// The InferencePoseLandmarkDetector already has been disposed. + /// is null. + /// 12 + public InferencePoseLandmarkDetectorResult Inference(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropPLD.Inference(_handle, source.Handle).Validate("Failed to inference pose landmark detection."); + + return new InferencePoseLandmarkDetectorResult(_handle); + } + + /// + /// Detects pose landmarks on the source image asynchronously. + /// + /// + /// can be empty, if there's no detected pose landmark.
+ /// This method uses about twice as much memory as . + ///
+ /// The image data to detect pose landmark. + /// The InferencePoseLandmarkDetector already has been disposed. + /// is null. + /// 12 + public async Task InferenceAsync(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropPLD.InferenceAsync(_handle, source.Handle).Validate("Failed to inference pose landmark detection."); + + return await Task.Factory.StartNew(() => new InferencePoseLandmarkDetectorResult(_handle), + CancellationToken.None, + TaskCreationOptions.DenyChildAttach | TaskCreationOptions.LongRunning, + TaskScheduler.Default); + } + + private ulong _requestId = 1; + /// + /// Requests detecting pose landmarks to get their points asynchronously. + /// + /// + /// This function does not guarantee that inference is done when this method returns. The user can get the result by using .
+ /// If the user calls this method again before the previous one is finished internally, the call will be ignored.
+ /// can be empty, if there's no detected pose landmark.
+ /// Note that this method could use about twice as much memory as . + ///
+ /// The image data to detect pose landmark. + /// The request ID that indicates the order of requests. + /// The InferencePoseLandmarkDetector already has been disposed. + /// is null. + /// + /// 12 + public ulong RequestInference(MediaVisionSource source) + { + ValidateNotDisposed(); + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + InteropPLD.InferenceAsync(_handle, source.Handle).Validate("Failed to inference pose landmark detection."); + + return _requestId++; + } + + /// + /// Gets the points as a result of . + /// + /// + /// If there's no detected pose landmark, will be empty.
+ /// This method uses about twice as much memory as . + ///
+ /// The points of detected pose landmark. + /// The InferencePoseLandmarkDetector already has been disposed. + /// + /// 12 + public InferencePoseLandmarkDetectorResult GetRequestResults() + { + return new InferencePoseLandmarkDetectorResult(_handle); + } + + /// + /// Releases the unmanaged resources used by the InferencePoseLandmarkDetector. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + /// 12 + protected virtual void Dispose(bool disposing) + { + if (!_disposed) + { + if (disposing) + { + // to be used if there are any other disposable objects + } + + if (_handle != IntPtr.Zero) + { + InteropPLD.Destroy(_handle); + _handle = IntPtr.Zero; + } + + _disposed = true; + } + } + + /// + /// Releases all resources used by the InferencePoseLandmarkDetector. + /// + /// 12 + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + internal void ValidateNotDisposed() + { + if (_disposed) + { + Log.Error(MediaVisionLog.Tag, "InferencePoseLandmarkDetector handle is disposed."); + throw new ObjectDisposedException(nameof(InferencePoseLandmarkDetector)); + } + } + } +} \ No newline at end of file diff --git a/src/Tizen.Multimedia.Vision/MediaVision/InferencePoseLandmarkDetectorResult.cs b/src/Tizen.Multimedia.Vision/MediaVision/InferencePoseLandmarkDetectorResult.cs new file mode 100755 index 00000000000..d7c9c16d713 --- /dev/null +++ b/src/Tizen.Multimedia.Vision/MediaVision/InferencePoseLandmarkDetectorResult.cs @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using InteropPLD = Interop.MediaVision.InferencePoseLandmarkDetection; + + +namespace Tizen.Multimedia.Vision +{ + /// + /// Represents the result of operations. + /// + /// 12 + public class InferencePoseLandmarkDetectorResult + { + internal InferencePoseLandmarkDetectorResult(IntPtr handle) + { + InteropPLD.GetResultCount(handle, out ulong requestId, out uint count). + Validate("Failed to get result count."); + + RequestId = requestId; + var points = new List(); + + for (uint i = 0 ; i < count ; i++) + { + InteropPLD.GetPoints(handle, i, out uint x, out uint y).Validate("Failed to get points."); + points.Add(new Point((int)x, (int)y)); + } + + Points = points; + } + + /// + /// Gets the request ID which is matched with request ID of RequestInference() return value.
+ /// It represents the order of request. + ///
+ /// The request ID that indicates the order of request. + /// 12 + public ulong RequestId { get; } + + /// + /// Gets the coordinates of detected pose landmarks. + /// + /// 12 + public IEnumerable Points { get; } + } +}