实时手势识别(C++与python都可实现)
一、前提配置:
Windows,visual studio 2019,opencv,python10,opencv-python,numpy,tensorflow,mediapipe,math
1.安装python环境
这里我个人使用的安装python10(google官方使用的python8)
安装相应的包,python路径添加到系统路径去,方便使用pip
pip install mediapipe opencv-python
pip install numpy==1.22.4
pip install tensorflow-cpu
二、基于python手势识别
打开运行infer.py
如果能正常运行使用,说明python环境没有问题。
infer.py下载在我gitee上,下面是链接地址
https://gitee.com/cnlycs/hand_static-lib/tree/master
如果只是使用python进行手势识别的话,把infer进行魔改就到此已经完成了
看看效果
0

label一共为[0,1,2,3,4,5]
三、C++实现
前面python的配置都得安装
最本质的原理是通过python对c++的接口实现的
(我也尝试过编译mediapipe源码给生成DLL文件,只能说现在各方面条件还不允许,不是网络问题,就是编译问题,能不能成功看运气,最后虽然成功了,但卡在了部署阶段)
1.创建新项目
通过visual studio 2019创建一个新项目,我选择的是控制台应用,毕竟展示出来给大家看,也可自己打包成静态库

2.在pose_demo.cpp中复制该代码
#include<iostream>
#include<Python.h>
#include <numpy/arrayobject.h>//numpy的头文件
#include<opencv/cv.hpp>//opencv的头文件
using namespace cv;
using namespace std;PyObject* Init_Hand_Model() {//加载numpy相关的库import_array();//命令行执行语句PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append('./script')");//PyImport_ImportModule:动态加载python模块,相当于导入python脚本文件PyObject* pModule = PyImport_ImportModule("infer");if (pModule == NULL) {cout << "pModule not found" << endl;}//调用模型加载PyObject* pFunc_load = PyObject_GetAttrString(pModule, "load_model");if (pFunc_load == NULL || PyCallable_Check(pFunc_load) == NULL) {cout << "pFunc_load not found!" << endl;return 0;}PyObject_CallObject(pFunc_load, NULL);//准备推理模型PyObject* pInfer = PyObject_GetAttrString(pModule, "infer_image");if (pInfer == NULL || PyCallable_Check(pInfer) == NULL) {cout << "pInfer not found!" << endl;return 0;}Py_DECREF(pModule);Py_DECREF(pFunc_load);return pInfer;
}cv::Mat Hand_Infer(cv::Mat img, PyObject* pInfer,int *res)
{PyArrayObject* array_com = NULL;PyObject* pRet = NULL;npy_intp dims[] = { img.rows, img.cols, img.channels() };//生成包含这个多维数组的PyObject对象,使用PyArray_SimpleNewFromData函数,//第一个参数2表示维度,第二个为维度数组Dims,第三个参数指出数组的类型,第四个参数为数组PyObject* pValue = PyArray_SimpleNewFromData(3, dims, NPY_UINT8, img.data);PyObject* pArgs = PyTuple_New(1);PyTuple_SetItem(pArgs, 0, pValue); /* pValue的引用计数被偷偷减一,无需手动再减 */pRet = PyObject_CallObject(pInfer, pArgs);Py_DECREF(pValue);Py_DECREF(pArgs);// 解析返回结果 //PyArrayObject* array_com;*res = -1;PyArray_OutputConverter(PyList_GetItem(pRet, 0), &array_com);npy_intp* shape = PyArray_SHAPE(array_com);Mat com(shape[0], shape[1], CV_8UC3, PyArray_DATA(array_com));PyArg_Parse(PyList_GetItem(pRet, 1),"i",res);return com;
}int hand_infer_by_camera() {//初始化python解释器Py_Initialize();PyObject* pInfer = Init_Hand_Model();VideoCapture cap(0);if (!cap.isOpened()){printf("Can not open a camera\n");return -1;}while (true){Mat img;cap >> img;if (img.empty())break;cv::flip(img, img, 1);int* res = new int;Mat com = Hand_Infer(img, pInfer, res);cout << *res;cv::imshow("com", com);cv::waitKey(10);/*cv::imshow("pha", pha);cv::waitKey(0);*/img.release();}Py_DECREF(pInfer);Py_Finalize();return 0;
}int main()
{hand_infer_by_camera();return 0;
}
到现在为止已经完成了一大半,还有很多报红的信息,别急,现在处理
3.环境配置
项目改为Release X64

配置项目属性

3.1包含目录的设置
项目include包含,python环境的include,script文件夹(gitee就能下载,里面就是infer.py),opencv下build/include,numpy/core/include
numpy在python的包文件夹里面,opencv自行下载

3.2库目录设置
python10环境下libs,numpy\core\lib,opencv\build\x64\vc15\lib设置3个lib路径即可

3.3附加依赖项
只需要配置opencv_world3410.lib即可

3.4设置script文件路径
前往https://gitee.com/cnlycs/hand_static-lib下载即可
把该文件夹放在pose_demo.cpp同一文件下即可

4.运行查看效果



相关文章:
实时手势识别(C++与python都可实现)
一、前提配置: Windows,visual studio 2019,opencv,python10,opencv-python,numpy,tensorflow,mediapipe,math 1.安装python环境 这里我个人使用的安装python10&#…...
15个Spring扩展点,一般人知道的不超过5个!
Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Spring Boot更是封装了Spring,遵循约定大于配置,加上自动装配的机制。很多时候我们只要引用了一个…...
Elasticsearch:以 “Painless” 方式保护你的映射
Elasticsearch 是一个很棒的工具,可以从各种来源收集日志和指标。 它为我们提供了许多默认处理,以便提供最佳用户体验。 但是,在某些情况下,默认处理可能不是最佳的(尤其是在生产环境中); 因此&…...
js几种对象创建方式
适用于不确定对象内部数据方式一:var p new Object(); p.name TOM; p.age 12 p.setName function(name) {this.name name; }// 测试 p.setName(jack) console.log(p.name,p.age)方式二: 对象字面量模式套路:使用{}创建对象,同…...
阿里云服务器ECS适用于哪些应用场景?
云服务器ECS具有广泛的应用场景,既可以作为Web服务器或者应用服务器单独使用,又可以与其他阿里云服务集成提供丰富的解决方案。 云服务器ECS的典型应用场景包括但不限于本文描述,您可以在使用云服务器ECS的同时发现云计算带来的技术红利。 阿…...
Ajax学习笔记01
引入 翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。 AJAX 不是新的编程语言,而是一种使用现有标准的新方法。 AJAX 最大的优点…...
Jinja2----------过滤器的使用、控制语句
目录 1.过滤器的使用 1.过滤器和测试器 2.过滤器 templates/filter.html app.py 效果 3.自定义过滤器 app.py templates/filter.html 效果 2.控制语句 1.if app.py templates/control.html 2.for app.py templates/control.htm 1.过滤器的使用 1.过滤器和测…...
面试了1个自动化测试,开口40W年薪,只能说痴人做梦...
公司前段缺人,也面了不少测试,结果竟然没有一个合适的。一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-20k,面试的人很多,但平均水平很让人失望。看简历很多都是3年工作经验,但面试…...
冲鸭!33% 程序员月薪达到 5 万元以上~
2023年,随着互联网产业的蓬勃发展,程序员作为一个自带“高薪多金”标签的热门群体,被越来越多的人所关注。在过去充满未知的一年中,他们的职场现状发生了一定的改变。那么,程序员岗位的整体薪资水平、婚恋现状、职业方…...
【RSA】HTTPS中SSL/TLS握手时RSA前后端加密流程
SSL/TLS层的位置 SSL/TLS层在网络模型的位置,它属于应用层协议。接管应用层的数据加解密,并通过网络层发送给对方。 SSL/TLS协议分握手协议和记录协议,握手协议用来协商会话参数(比如会话密钥、应用层协议等等)&…...
clion在linux设置桌面启动图标(jetbrains全家桶均适用)
clion在linux设置桌面启动图标(jetbrains全家桶均适用) 网上大部分步骤都只是pycharm的教程,其实对于jetbrains全家桶都适合,vs code编辑器也可以这样。 刚开始是使用pycharm在linux设置的教程,参照:http…...
Java数据结构LinkedList单链表和双链表模拟实现及相关OJ题秒AC总结知识点
本篇文章主要讲述LinkedList链表中从初识到深入相关总结,常见OJ题秒AC,望各位大佬喜欢 一、单链表 1.1链表的概念及结构 1.2无头单向非循环链表模拟实现 1.3测试模拟代码 1.4链表相关面试OJ题 1.4.1 删除链表中等于给定值 val 的所有节点 1.4.2 反转…...
立创EDA 学习 day01 应用下载安装,基本使用的操作
1.下载网站 1.链接:立创EDA下载-立创EDA官方版-PC下载网 (pcsoft.com.cn) 2.安装立创EDA 1.直接 next (简单的操作) 3.注册账号 1. 最好注册一个账号,等下在原理图转PCB 板的时候要登录,才可以。 4.新建工程 1.新…...
华为OD机试真题Python实现【火星文计算】真题+解题思路+代码(20222023)
火星文计算 题目 已经火星人使用的运算符号为# $ 其与地球人的等价公式如下 x#y=2*x+3*y+4 x$y=3*x+y+2 x y是无符号整数 地球人公式按照 c 语言规则进行计算 火星人公式中$符优先级高于#相同的运算符按从左到右的顺序运算 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华…...
yolov8 修改类别 自定义数据集
yolov8 加载yolo网络模型 yolov8n.yaml nc: 80 # number of classes 分类数量 depth_multiple: 0.33 # scales module repeats 重复规模 width_multiple: 0.25 # scales convolution channels 缩放卷积通道 backbone head 指定配置 coco128.yaml path: ../datasets/coco128 # d…...
Linux环境下验证python项目
公司大佬开发的python rpa跑数项目,Windows运行没问题后,需要搭建一个linux环境进行验证,NOW START! Install VMware官网 下载好之后打开按步骤安装 最后一步会让填许可证(密钥),这里自行百…...
MAC开发使用技巧
1. 查看所有安装的程序 您可以通过以下步骤在 macOS 中查看所有已安装的程序: 点击屏幕左上角的苹果图标,选择“关于本机”。 在打开的窗口中,选择“系统报告”。 在系统报告窗口中,选择“软件”选项卡,然后选择“安…...
第三章-OpenCV基础-7-形态学
前置 形态学主要是从图像中提取分量信息,该分量信息通常是图像理解时所使用的最本质的形状特征,对于表达和描绘图像的形状有重要意义。 大体就是通过一系列操作让图像信息中的关键信息更加凸出。同时,形态学的操作都是基于灰度图进行。 相关操作最主要…...
DeepFaceLab 中Ubuntu(docker gpu) 部署
DeepFaceLab 在windows图形界面部署比较多,下面用ubuntu 部署在服务器上。部署过程中python版本,或者protobuf版本可能有问题,所以建议用docker 代码下载 cd /trainssdgit clone --depth 1 https://github.com/nagadit/DeepFaceLab_Linux.g…...
分析帆软填报报表点提交的逻辑
1 点提交这里首先会校验数据,校验成功后就去入库数据,这里不分析校验,分析下校验成功后数据是怎么入库的。 2 我们知道当点提交时,发送的请求中的参数为 op=fr_write,cmd=submit_w_report. 在帆软报表中op表示服务,cmd表示服务中的一个动作处理。比如op=fr_write这个服务…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
