From: Inki Dae Date: Tue, 23 Jul 2024 05:07:57 +0000 (+0900) Subject: backends/mediavision: add hand landmark API support X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a39e8f0bf4f2a3e46d1b3414380cfb7ff98d8fd7;p=platform%2Fcore%2Fapi%2Fsingleo.git backends/mediavision: add hand landmark API support Change-Id: I9ad37221cdbc9b39192e9e24d1879ec3a342d680 Signed-off-by: Inki Dae --- diff --git a/inference/backends/mediavision/CMakeLists.txt b/inference/backends/mediavision/CMakeLists.txt index d1482eb..380115c 100644 --- a/inference/backends/mediavision/CMakeLists.txt +++ b/inference/backends/mediavision/CMakeLists.txt @@ -7,6 +7,7 @@ SET(INFERENCE_MEDIAVISION_BACKEND_DIRECTORY ${INFERENCE_DIRECTORY}/backends/medi SET(SINGLEO_SERVICE_SOURCE_FILES ${SINGLEO_SERVICE_SOURCE_FILES} + ${INFERENCE_MEDIAVISION_BACKEND_DIRECTORY}/src/MvHandLandmark.cpp ${INFERENCE_MEDIAVISION_BACKEND_DIRECTORY}/src/MvHandDetection.cpp ${INFERENCE_MEDIAVISION_BACKEND_DIRECTORY}/src/MvFaceDetection.cpp ${INFERENCE_MEDIAVISION_BACKEND_DIRECTORY}/src/MvFaceLandmark.cpp diff --git a/inference/backends/mediavision/include/MvHandLandmark.h b/inference/backends/mediavision/include/MvHandLandmark.h new file mode 100644 index 0000000..901d1c8 --- /dev/null +++ b/inference/backends/mediavision/include/MvHandLandmark.h @@ -0,0 +1,51 @@ +/** + * 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. + */ + +#ifndef __MV_HAND_LANDMARK_H__ +#define __MV_HAND_LANDMARK_H__ + +#include "IInferenceTaskInterface.h" +#include "mv_hand_landmark.h" +#include "mv_hand_landmark_internal.h" +#include "SingleoCommonTypes.h" + +namespace singleo +{ +namespace inference +{ +namespace backends +{ +class MvHandLandmark : public IInferenceTaskInterface +{ +private: + mv_hand_landmark_h _handle {}; + FldResultType _output_data; + +public: + MvHandLandmark(); + virtual ~MvHandLandmark(); + + void configure() override; + void prepare() override; + void invoke(BaseDataType &input, bool async) override; + BaseResultType &result() override; +}; + +} // backends +} // inference +} // singleo + +#endif diff --git a/inference/backends/mediavision/include/MvInferenceTaskFactory.h b/inference/backends/mediavision/include/MvInferenceTaskFactory.h index 94be99f..f8023c1 100644 --- a/inference/backends/mediavision/include/MvInferenceTaskFactory.h +++ b/inference/backends/mediavision/include/MvInferenceTaskFactory.h @@ -38,6 +38,7 @@ public: std::unique_ptr createFaceLandmarkDetection() override; std::unique_ptr createFaceRecognition() override; std::unique_ptr createHandDetection() override; + std::unique_ptr createHandLandmark() override; }; } diff --git a/inference/backends/mediavision/src/MvHandLandmark.cpp b/inference/backends/mediavision/src/MvHandLandmark.cpp new file mode 100644 index 0000000..ab9e9a6 --- /dev/null +++ b/inference/backends/mediavision/src/MvHandLandmark.cpp @@ -0,0 +1,116 @@ +/** + * 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. + */ + +#include +#include "MvHandLandmark.h" +#include "SingleoLog.h" + +using namespace std; + +namespace singleo +{ +namespace inference +{ +namespace backends +{ +MvHandLandmark::MvHandLandmark() +{ + int ret = mv_hand_landmark_create(&_handle); + if (ret != MEDIA_VISION_ERROR_NONE) + throw runtime_error("Fail to create hand landmark detection handle."); +} + +MvHandLandmark::~MvHandLandmark() +{ + mv_hand_landmark_destroy(_handle); +} + +void MvHandLandmark::configure() +{ + int ret = mv_hand_landmark_configure(_handle); + if (ret != MEDIA_VISION_ERROR_NONE) + throw runtime_error("Fail to configure hand landmark detection."); +} + +void MvHandLandmark::prepare() +{ + int ret = mv_hand_landmark_prepare(_handle); + if (ret != MEDIA_VISION_ERROR_NONE) + throw runtime_error("Fail to prepare hand landmark detection."); +} + +void MvHandLandmark::invoke(BaseDataType &input, bool async) +{ + ImageDataType &data = dynamic_cast(input); + + if (data._data_type != DataType::IMAGE) { + SINGLEO_LOGE("Invalid input type."); + throw invalid_argument("Input type not support."); + } + + mv_source_h mv_src; + + int ret = mv_create_source(&mv_src); + if (ret != MEDIA_VISION_ERROR_NONE) + throw runtime_error("Fail to create mv source."); + + try { + ret = mv_source_fill_by_buffer(mv_src, data.ptr, data.width * data.height * data.byte_per_pixel, data.width, + data.height, MEDIA_VISION_COLORSPACE_RGB888); + if (ret != MEDIA_VISION_ERROR_NONE) + throw runtime_error("Fail to convert to mv source."); + + ret = mv_hand_landmark_inference(_handle, mv_src); + if (ret != MEDIA_VISION_ERROR_NONE) + throw runtime_error("Fail to invoke hand landmark detection."); + } catch (std::runtime_error &e) { + SINGLEO_LOGE("%s", e.what()); + } + + ret = mv_destroy_source(mv_src); + if (ret != MEDIA_VISION_ERROR_NONE) + throw runtime_error("Fail to destroy mv source."); +} + +BaseResultType &MvHandLandmark::result() +{ + unsigned long frame_number; + unsigned int result_cnt; + + int ret = mv_hand_landmark_get_result_count(_handle, &frame_number, &result_cnt); + if (ret != MEDIA_VISION_ERROR_NONE) + throw runtime_error("Fail to get hand landmark detection result count."); + + _output_data._is_empty = result_cnt == 0; + _output_data._points.clear(); + _output_data._frame_number = frame_number; + + for (unsigned int idx = 0; idx < result_cnt; ++idx) { + Point point; + + ret = mv_hand_landmark_get_position(_handle, idx, (unsigned int *) &point.x, (unsigned int *) &point.y); + if (ret != MEDIA_VISION_ERROR_NONE) + throw runtime_error("Fail to get hand landmark detection point."); + + _output_data._points.push_back(point); + } + + return _output_data; +} + +} +} +} diff --git a/inference/backends/mediavision/src/MvInferenceTaskFactory.cpp b/inference/backends/mediavision/src/MvInferenceTaskFactory.cpp index 5e9e7cb..5485fbf 100644 --- a/inference/backends/mediavision/src/MvInferenceTaskFactory.cpp +++ b/inference/backends/mediavision/src/MvInferenceTaskFactory.cpp @@ -22,6 +22,7 @@ #include "MvObjectDetection.h" #include "MvImageClassification.h" #include "MvHandDetection.h" +#include "MvHandLandmark.h" #include "SingleoLog.h" #include "SingleoException.h" @@ -66,5 +67,10 @@ std::unique_ptr MvInferenceTaskFactory::createHandDetec return make_unique(); } +std::unique_ptr MvInferenceTaskFactory::createHandLandmark() +{ + return make_unique(); +} + } } diff --git a/inference/include/IInferenceTaskFactory.h b/inference/include/IInferenceTaskFactory.h index 7bc3e90..893084d 100644 --- a/inference/include/IInferenceTaskFactory.h +++ b/inference/include/IInferenceTaskFactory.h @@ -36,6 +36,7 @@ public: virtual std::unique_ptr createFaceLandmarkDetection() = 0; virtual std::unique_ptr createFaceRecognition() = 0; virtual std::unique_ptr createHandDetection() = 0; + virtual std::unique_ptr createHandLandmark() = 0; }; }