#include "singleo_native_capi.h"
typedef void (*singleo_user_cb_t)(unsigned char *buffer, unsigned int width, unsigned int height,
- unsigned int bytes_per_pixel, void *user_data);
+ unsigned int bytes_per_pixel, void *user_data, void *user_data2);
/**
* @internal
int singleo_service_register_user_callback(singleo_service_h handle,
void (*callback_ptr)(unsigned char *buffer, unsigned int width,
unsigned int height, unsigned int bytes_per_pixel,
- void *user_data),
+ void *user_data, void *user_data2),
void *user_data);
/**
SET(SINGLEO_INFERENCE_HEADER_DIRECTORY "")
SET(SINGLEO_INFERENCE_SERVUCE_FILE "{PROJECT_SOURCE_DIR}/src/InferenceServiceExternal.cpp")
ELSE()
- SET(SINGLEO_INFERENCE_HEADER_DIRECTORY /usr/include/media backends/mediavision/include backends/private/include)
+ SET(SINGLEO_INFERENCE_HEADER_DIRECTORY /usr/include/media /usr/include/mediapipe backends/mediavision/include backends/private/include)
SET(SINGLEO_INFERENCE_SERVUCE_FILE
${SINGLEO_INFERENCE_SERVUCE_FILE}
${PROJECT_SOURCE_DIR}/src/MvInferenceServiceFactory.cpp
PKG_CHECK_MODULES(${PROJECT_NAME}_DEP REQUIRED capi-media-vision opencv facedetection)
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PRIVATE ../include ../../common/include ../../log/include mediavision/include /usr/include/media private/include /usr/include/facedetection /usr/include/mediapipe)
-TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE mv_common singleo_log ${${PROJECT_NAME}_DEP_LIBRARIES} )
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE mv_common singleo_log mediapipe_gesture_recognizer_solution ${${PROJECT_NAME}_DEP_LIBRARIES} )
# Install the library
INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${LIB_INSTALL_DIR})
#include <memory>
#include <vector>
#include <opencv2/core.hpp>
+#include "mediapipe_hand_solution_api.h"
#include "IInferenceHandGestureService.h"
+
namespace singleo
{
namespace inference
{
class PrivateInferenceHandGestureService : public IInferenceHandGestureService
{
-private:
-
+private:
HandGestureResult _result;
+ std::unique_ptr<mediapipe_solutions::HandGesture> _gesture;
public:
PrivateInferenceHandGestureService(std::vector<inference::TaskType> &tasks);
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
-#include "IHand.h"
using namespace std;
+using namespace mediapipe_solutions;
+
#define DETECT_BUFFER_SIZE 0x9000
namespace singleo
{
PrivateInferenceHandGestureService::PrivateInferenceHandGestureService(std::vector<inference::TaskType> &tasks)
{
-
+ SINGLEO_LOGI("PrivateInferenceHandGestureService: ctor");
+ _gesture = make_unique<HandGesture>();
+ SINGLEO_LOGI("PrivateInferenceHandGestureService: ctor-done");
}
PrivateInferenceHandGestureService::~PrivateInferenceHandGestureService()
void PrivateInferenceHandGestureService::prepare()
{
-
+
}
void PrivateInferenceHandGestureService::invoke(BaseDataType &input)
{
+ Timer timer;
+ Timer partial;
+ if (input._data_type != DataType::IMAGE) {
+ SINGLEO_LOGE("Invalid input type.");
+ throw invalid_argument("Input type not support.");
+ }
+
+ SINGLEO_LOGD("PrivateInferenceHandGestureService: invoke");
+ ImageDataType &data = dynamic_cast<ImageDataType &>(input);
+ cv::Mat cvData_(cv::Size(data.width, data.height), CV_MAKE_TYPE(CV_8U, data.byte_per_pixel), data.ptr);
+ _result._gestureCategory = _gesture->recognize(cvData_);
+ SINGLEO_LOGD("PrivateInferenceHandGestureService: %s recognized", _result._gestureCategory.c_str());
}
HandGestureResult& PrivateInferenceHandGestureService::result()
using Points = std::vector<Point>;
struct HandGestureResult {
unsigned int _frame_number {};
- int _gestureId;
+ std::string _gestureCategory;
};
} // inference
} // singleo
BuildRequires: pkgconfig(re2)
BuildRequires: pkgconfig(facedetection)
BuildRequires: mediapipe-devel
-# BuildRequires: mediapipe-image-segmentation
+BuildRequires: mediapipe-handsolution
%define enable_autozoom_api 0
%define enable_smartpointer 1
public:
explicit HandGestureRecognizer(input::InputConfigBase &config);
~HandGestureRecognizer();
- int recognizeGesture(BaseDataType &input);
+ std::string recognizeGesture(BaseDataType &input);
};
} // smartpointer
// MvInferenceServiceFactory factory;
PrivateInferenceServiceFactory factory;
_recognizer = factory.createInferenceHandGestureService(_tasks);
-
- _recognizer->configure();
- _recognizer->prepare();
}
HandGestureRecognizer::~HandGestureRecognizer()
}
-int HandGestureRecognizer::recognizeGesture(BaseDataType &input)
+string HandGestureRecognizer::recognizeGesture(BaseDataType &input)
{
- SINGLEO_LOGD("HandGestureRecognizer->recognizeGesture");
- return -1;
+ _recognizer->invoke(input);
+ auto result = _recognizer->result();
+ return result._gestureCategory;
// _recognizer->invoke(input);
// auto &result = _recognizer->result();
}
memcpy(copied.ptr, image_data.ptr, buffer_size);
if (smart_pointer->_user_cb) {
- smart_pointer->_user_cb(copied.ptr, copied.width, copied.height, copied.byte_per_pixel, smart_pointer->_user_data);
+ smart_pointer->_user_cb(copied.ptr, copied.width, copied.height, copied.byte_per_pixel, smart_pointer->_user_data, nullptr);
}
if (smart_pointer->getAsyncManager()->pushInput(copied) != SINGLEO_ERROR_NONE)
if (_user_cb) {
SINGLEO_LOGD("user callback in perform()");
_user_cb(input_data.ptr, input_data.width, input_data.height, input_data.byte_per_pixel,
- static_cast<void *>(&(_pointerPosition.pose._rot_vec)));
+ static_cast<void *>(&(_pointerPosition.pose._rot_vec)),
+ static_cast<void *>(&gestureResult));
}
}
}
void data_feeder_cb(unsigned char *buffer, unsigned int width, unsigned int height, unsigned int bytes_per_pixel,
- void *user_data)
+ void *headPose, void *gesture)
{
cv::Mat result(cv::Size(width, height), CV_MAKETYPE(CV_8U, bytes_per_pixel), buffer);
cv::Mat vizData;
cv::cvtColor(result, vizData, cv::COLOR_BGR2RGBA);
- Point3f *dof3d = static_cast<Point3f *>(user_data);
+ string *gesture_str = static_cast<string *>(gesture);
+ cv::putText(vizData, *gesture_str, cv::Point(30, 30), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 255, 0, 255), 2);
+
+ Point3f *dof3d = static_cast<Point3f *>(headPose);
+
cout << "[Pitch, Yaw, Roll]: [ " << dof3d->x << ", " << dof3d->y << ", " << dof3d->z << " ]" << endl;
+ cout << "[Gesture Str]: " << *gesture_str << endl;
singleo_util_visualizer_2d(vizData, NULL);
}