// HolisticTrackingApi.h#ifndef HOLISTIC_TRACKING_API_H
#define HOLISTIC_TRACKING_API_H#define EXPORT#include <malloc.h>
#include <vector>
#include "HolisticTrackingDetect.h" // 添加这一行#ifdef _WIN32
#ifdef EXPORT
#define EXPORT_API __declspec(dllexport)
#else
#define EXPORT_API __declspec(dllimport)
#endif
#else
#include <stdlib.h>#ifdef EXPORT
#define EXPORT_API __attribute__((visibility ("default")))
#else
#endif#endif#ifdef __cplusplus
extern "C" {
#endif #ifndef EXPORT_API
#define EXPORT_API
#endifEXPORT_API int MediapipeHolisticTrackingInit(const char* model_path);EXPORT_API int MediapipeHolisticTrackingDetectFrameDirect(int image_width, int image_height,void* image_data,std::vector<Point2D>& pose_result,std::vector<Point2D>& left_hand_result,std::vector<Point2D>& right_hand_result);EXPORT_API int MediapipeHolisticTrackingRelease();#ifdef __cplusplus
}
#endif #endif // HOLISTIC_TRACKING_API_H
// HolisticTrackingApi.cpp#include "HolisticTrackingApi.h"
#include "HolisticTrackingDetect.h"using namespace GoogleMediapipeDetect;HolisticTrackingDetect m_HolisticTrackingDetect;EXPORT_API int MediapipeHolisticTrackingInit(const char* model_path)
{return m_HolisticTrackingDetect.InitModel(model_path);
}EXPORT_API int MediapipeHolisticTrackingDetectFrameDirect(int image_width, int image_height,void* image_data,std::vector<Point2D>& pose_result,std::vector<Point2D>& left_hand_result,std::vector<Point2D>& right_hand_result)
{// 调用DetectImageDirect时只传递了六个参数return m_HolisticTrackingDetect.DetectImageDirect(image_width, image_height,image_data, pose_result, left_hand_result, right_hand_result);
}EXPORT_API int MediapipeHolisticTrackingRelease()
{return m_HolisticTrackingDetect.Release();
}
#ifndef HOLISTIC_TRACKING_DETECT_H
#define HOLISTIC_TRACKING_DETECT_H#include <cstdlib>
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "mediapipe/framework/calculator_framework.h"
#include "mediapipe/framework/formats/image_frame.h"
#include "mediapipe/framework/formats/image_frame_opencv.h"
#include "mediapipe/framework/port/file_helpers.h"
#include "mediapipe/framework/port/opencv_highgui_inc.h"
#include "mediapipe/framework/port/opencv_imgproc_inc.h"
#include "mediapipe/framework/port/opencv_video_inc.h"
#include "mediapipe/framework/port/parse_text_proto.h"
#include "mediapipe/framework/port/status.h"#include "mediapipe/framework/formats/detection.pb.h"
#include "mediapipe/framework/formats/landmark.pb.h"
#include "mediapipe/framework/formats/rect.pb.h"struct Point2D {float x;float y;
};namespace GoogleMediapipeDetect {class HolisticTrackingDetect {public:HolisticTrackingDetect();int InitModel(const char* model_path);int DetectImageDirect(int image_width, int image_height, void* image_data, std::vector<Point2D>& posePoints, std::vector<Point2D>& leftHandPoints, std::vector<Point2D>& rightHandPoints);int Release();private:bool m_bIsInit;bool m_bIsRelease;std::string m_Video_InputStreamName;std::string m_PoseLandmarks_OutputStreamName;std::string m_LeftHandLandmarks_OutputStreamName;std::string m_RightHandLandmarks_OutputStreamName;std::string m_FaceLandmarks_OutputStreamName;mediapipe::OutputStreamPoller* m_pPoseLandmarksPoller;mediapipe::OutputStreamPoller* m_pLeftHandLandmarksPoller;mediapipe::OutputStreamPoller* m_pRightHandLandmarksPoller;mediapipe::OutputStreamPoller* m_pFaceLandmarksPoller;absl::Status Mediapipe_InitGraph(const char* model_path);absl::Status Mediapipe_RunMPPGraph_Direct(int image_width, int image_height, void* image_data, std::vector<Point2D>& posePoints, std::vector<Point2D>& leftHandPoints, std::vector<Point2D>& rightHandPoints);absl::Status Mediapipe_ReleaseGraph();};} // namespace GoogleMediapipeDetect#endif // HOLISTIC_TRACKING_DETECT_H
#include <vector>#include "HolisticTrackingDetect.h"GoogleMediapipeDetect::HolisticTrackingDetect::HolisticTrackingDetect()
{m_bIsInit = false;m_bIsRelease = false;m_Video_InputStreamName = "input_video";m_PoseLandmarks_OutputStreamName = "pose_landmarks";m_LeftHandLandmarks_OutputStreamName = "left_hand_landmarks";m_RightHandLandmarks_OutputStreamName = "right_hand_landmarks";m_FaceLandmarks_OutputStreamName = "face_landmarks";m_pPoseLandmarksPoller = nullptr;m_pLeftHandLandmarksPoller = nullptr;m_pRightHandLandmarksPoller = nullptr;m_pFaceLandmarksPoller = nullptr;
}int GoogleMediapipeDetect::HolisticTrackingDetect::InitModel(const char* model_path) {// 初始化模型absl::Status run_status = Mediapipe_InitGraph(model_path);if (!run_status.ok()) {return 0;}m_bIsInit = true;return 1;
}int GoogleMediapipeDetect::HolisticTrackingDetect::DetectImageDirect(int image_width, int image_height, void* image_data, std::vector<Point2D>& posePoints, std::vector<Point2D>& leftHandPoints, std::vector<Point2D>& rightHandPoints) {// 处理图像并返回关键点位置信息if (!m_bIsInit) {return 0;}absl::Status run_status = Mediapipe_RunMPPGraph_Direct(image_width, image_height, image_data, posePoints, leftHandPoints, rightHandPoints);if (!run_status.ok()) {return 0;}return 1;
}int GoogleMediapipeDetect::HolisticTrackingDetect::Release() {// 释放资源absl::Status run_status = Mediapipe_ReleaseGraph();if (!run_status.ok()) {return 0;}m_bIsRelease = true;return 1;
}absl::Status GoogleMediapipeDetect::HolisticTrackingDetect::Mediapipe_InitGraph(const char* model_path)
{// 省略模型初始化的代码return absl::OkStatus(); // 添加这一行
}absl::Status GoogleMediapipeDetect::HolisticTrackingDetect::Mediapipe_RunMPPGraph_Direct(int image_width, int image_height, void* image_data, std::vector<Point2D>& posePoints, std::vector<Point2D>& leftHandPoints, std::vector<Point2D>& rightHandPoints)
{// 处理图像并返回关键点位置信息// 省略处理图像的代码// 获取PoseLandmarksmediapipe::Packet poseeLandmarksPacket;if (m_pPoseLandmarksPoller->QueueSize() != 0 && m_pPoseLandmarksPoller->Next(&poseeLandmarksPacket)) {auto& output_landmarks = poseeLandmarksPacket.Get<mediapipe::NormalizedLandmarkList>();for (int i = 0; i < output_landmarks.landmark_size(); ++i) {const mediapipe::NormalizedLandmark landmark = output_landmarks.landmark(i);float x = landmark.x() * image_width;float y = landmark.y() * image_height;posePoints.emplace_back(Point2D{ x, y });}}// 获取LeftHandLandmarksmediapipe::Packet leftHandLandmarksPacket;if (m_pLeftHandLandmarksPoller->QueueSize() != 0 && m_pLeftHandLandmarksPoller->Next(&leftHandLandmarksPacket)) {auto& output_landmarks = leftHandLandmarksPacket.Get<mediapipe::NormalizedLandmarkList>();for (int i = 0; i < output_landmarks.landmark_size(); ++i) {const mediapipe::NormalizedLandmark landmark = output_landmarks.landmark(i);float x = landmark.x() * image_width;float y = landmark.y() * image_height;leftHandPoints.emplace_back(Point2D{ x, y });}}// 获取RightHandLandmarksmediapipe::Packet rightHandLandmarksPacket;if (m_pRightHandLandmarksPoller->QueueSize() != 0 && m_pRightHandLandmarksPoller->Next(&rightHandLandmarksPacket)) {auto& output_landmarks = rightHandLandmarksPacket.Get<mediapipe::NormalizedLandmarkList>();for (int i = 0; i < output_landmarks.landmark_size(); ++i) {const mediapipe::NormalizedLandmark landmark = output_landmarks.landmark(i);float x = landmark.x() * image_width;float y = landmark.y() * image_height;rightHandPoints.emplace_back(Point2D{ x, y });}}return absl::OkStatus();
}absl::Status GoogleMediapipeDetect::HolisticTrackingDetect::Mediapipe_ReleaseGraph()
{// 释放资源的代码return absl::OkStatus(); // 添加这一行
}
BUILD:
cc_binary(
name = "Mediapipe_Hand_Tracking",
srcs = ["hand_tracking_api.h","hand_tracking_api.cpp","hand_tracking_detect.h","hand_tracking_detect.cpp","hand_tracking_data.h","hand_gesture_recognition.h","hand_gesture_recognition.cpp"],
linkshared=True,
deps = [
"@com_google_absl//absl/flags:flag",
"@com_google_absl//absl/flags:parse",
"//mediapipe/graphs/hand_tracking:desktop_tflite_calculators",
"//mediapipe/framework:calculator_framework",
"//mediapipe/framework/formats:image_frame",
"//mediapipe/framework/formats:image_frame_opencv",
"//mediapipe/framework/port:opencv_imgproc",
"//mediapipe/framework/port:opencv_video",
"//mediapipe/framework/port:opencv_highgui",
"//mediapipe/framework/port:parse_text_proto",
"//mediapipe/framework/port:file_helpers",
"//mediapipe/framework/port:status",
],
)
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 --action_env PYTHON_BIN_PATH="C:/Python39/python.exe" mediapipe/examples/desktop/holistic_tracking_dll:MediapipeHolisticTracking --verbose_failures