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; }
+ }
+}