mediapipe 导出dll

// 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《行列视》的优势您了解多少?

《行列视》定位于生产制造型企业的生产过程数据应用分析领域&#xff0c;主要解决 生产过程实时、历史数据与生产管理所需要的管理指标之间的统计、计算问题&#xff0c; 以及基于生产过程数据和管理指标的各种日常工作、管理、和经营的业务应用自 助建设问题。它自身的优势…

Blender小记

快捷键 G 移动模型(长按Ctrl令模型逐网格移动) S 缩放模型 R 旋转模型 点击X Y Z可让模型沿XYZ轴改变, 默认为当前坐标系, 再次点击切换坐标系(全局坐标/局部坐标) Alt G/S/R 撤销改变 缩放时, Shift X/Y/Z可令X/Y/Z方向不受影响 缩放时, S X/Y/Z 0可让被选中项沿该轴垂直…

简单有效的数据加密方法你知道几个?

1. 文件和邮件加密 利用华企盾DSC数据防泄密系统&#xff0c;企业可以实现文件和邮件的加密。系统提供了一键式的文件加密解决方案&#xff0c;确保敏感信息在电子邮件中传输时得到安全保护&#xff0c;即使邮件被截获&#xff0c;内容也无法被未授权人员阅读。 2. 端到端数据…

vue中中文汉字转拼音的小工具

使用 <script> import pinyin from /utils/pinyinexport default {name: "",data() {return {。。。}},created() {this.test()},methods: {test() {let l1 拼音转汉字;console.log(pinyin.chineseToPinYin(l1))}, 组件 export const pinyin {a: \u554a\u963…

UNetformer实现遥感城市场景影像的高效语义分割

UNetFormer:一种类似UNet的转换器,用于遥感城市场景影像的高效语义分割,ISPRS。此外,还包括用于卫星、航空图像和无人机图像分割。 本文选取的是WHU-Building-DataSets。数据集[1]包含了从新西兰基督城的航空图像中提取的超过220,000个独立建筑,图像被分割成了8189个5125…

Lambda 表达式详解

LAMBDA ⚪ λ 希腊字母表中排序第十一位的字母, 英语名称为Lambda ⚪ 避免匿名内部类定义过多 ⚪ 其实质属于函数式编程的概念 ⚪ 也可称为闭包 ⚪ Lambda允许把一个函数作为方法的参数&#xff08;函数作为参数传递进方法中&#xff09;。 Lambda是在jdk8之后出现的所以现…

FloodFill算法---BFS

目录 一、前言 二、算法模板套路 2.1 创建所需的全局变量&#xff1a; 2.2 BFS模板&#xff1a; 2.3 细节处理&#xff1a; 三、例题练习 3.1 例题1&#xff1a;图像渲染 3.2 例题2&#xff1a;岛屿数量 3.3 例题3&#xff1a;岛屿的最大面积 3.4 例题4&#xff1a;被…

人工智能应用正在改变我们的生活

在这个AI蓬勃发展的时代&#xff0c;你如何使用人工智能&#xff1f;如果您认为还没有&#xff0c;请再想一想。人工智能已经为我们的许多日常活动提供了动力&#xff0c;尽管您可能还没有有意将其用作工具&#xff0c;但这种情况可能会在不久的将来发生变化。随着顶尖科技公司…

ScheduledExecutorService详解

文章目录 基础定义主要特点schedule延迟不循环scheduleAtFixedRate延迟且循环scheduleWithFixedDelay严格延迟且循环取消特定定时任务 基础定义 ScheduledExecutorService是Java并发包中提供的一个接口&#xff0c;用于执行定时任务。它继承自ExecutorService接口&#xff0c;并…

如何更换远程服务器的Python版本

目录 前言 正文 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f4eb; You can reach me by url below:My Blo…

简单的mysql主从复制搭建

文章目录 准备工作用Docker安装MySQL主库配置【192.168.13.32】从库配置【192.168.13.108】小结 准备工作 用虚拟机提前准备两台服务器&#xff0c;并且在服务器中分别安装好MySQL&#xff0c;服务器的信息如下&#xff1a; 数据库IP主节点192.168.13.32从节点192.168.13.108…

IDEA终端环境配置

Idea如何配置终端&#xff1b; 第一步&#xff1a;找到我的电脑&#xff0c;右击——属性——高级系统设置——环境变量 先配置path: 在后面加入&#xff1a;C:\Program Files (x86)\Java\jdk1.7.0_75\bin&#xff08;每个人放置jdk的位置不同。&#xff09; 新建classpath:…

【MySQL数据库】初步认识数据库,实现基本操作

在信息爆炸的今天&#xff0c;数据无处不在&#xff0c;它们构成了互联网世界的基石。但数据本身若未经有效组织和管理&#xff0c;就如同散落在沙滩上的珍珠&#xff0c;难以发挥其真正的价值。这时&#xff0c;“数据库”这一概念便如同一根线&#xff0c;将这些珍珠串联起来…

【Redis】Redis 主从集群(一)

为了避免 Redis 的单点故障问题&#xff0c;可以搭建一个 Redis 集群&#xff0c;将数据备份到集群中的其它节点上。若一个 Redis 节点宕机&#xff0c;则由集群中的其它节点顶上 1.主从集群搭建 Redis 的主从集群是一个“一主多从”的读写分离集群。集群中的 Master 节点负责…

从油猴脚本管理器的角度审视Chrome扩展

从油猴脚本管理器的角度审视Chrome扩展 在之前一段时间&#xff0c;我需要借助Chrome扩展来完成一个需求&#xff0c;当时还在使用油猴脚本与浏览器扩展之间调研了一波&#xff0c;而此时恰好我又有一些做的还可以的油猴脚本TKScript (点个star吧 &#x1f601;)&#xff0c;相…

面向对象 05:三大特性之——继承,继承在 Java 中的相关使用,区分关键字 super 和 this,方法重写的注意点

一、前言 记录时间 [2024-05-13] 系列文章简摘&#xff1a; 面向对象 01&#xff1a;Java 面向对象相关内容整体概述 面向对象 02&#xff1a;区分面向过程与面向对象&#xff0c;类和对象的关系 面向对象 03&#xff1a;类与对象的创建、初始化和使用&#xff0c;通过 new 关键…

数字人解决方案——AniPortrait音频驱动的真实肖像动画合成

概述 在当今数字化时代&#xff0c;将静态图像和音频素材转化为动态、富有表现力的肖像动画&#xff0c;已经成为游戏、数字媒体、虚拟现实等多个领域的重要技术。然而&#xff0c;开发人员在创建既具有视觉吸引力又能保持时间一致性的高质量动画框架方面面临着巨大挑战。其中…

k8s endpoint

Endpoint Service 并不是和 pod 直接相连的&#xff0c;Endpoint 介于两者之间。Endpoint 资源就是暴露一个服务的 IP 地址和端口的列表。 虽然在 spec 服务中定义了 pod 选择器&#xff0c;但在重定向传入连接时不会直接使用它。选择器用于构建 IP 和端口列表&#xff0c;然…

数据特征降维 | t-分布随机邻域嵌入(t-SNE)附Python代码

t-分布随机邻域嵌入(t-Distributed Stochastic Neighbor Embedding,t-SNE)是一种非线性降维和可视化技术,广泛用于高维数据的可视化和聚类分析。 t-SNE的基本思想是通过在高维空间中测量样本之间的相似性,将其映射到低维空间中,以便更好地展示数据的结构和关系。与传统的…

优思学院:精益六西格玛如何影响企业文化?

精益六西格玛&#xff08;Lean Six Sigma&#xff09;是一种在优化生产过程、提高效率、减少浪费的管理方法论。其影响远不止于生产线或质量控制部门&#xff0c;实际上&#xff0c;精益六西格玛的实施可以深刻影响企业文化的各个层面&#xff0c;從而令企業獲得真正最大的成功…