当前位置: 首页 > news >正文

实时手势识别(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.运行查看效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/24808.html

相关文章:

  • 15个Spring扩展点,一般人知道的不超过5个!
  • Elasticsearch:以 “Painless” 方式保护你的映射
  • js几种对象创建方式
  • 阿里云服务器ECS适用于哪些应用场景?
  • Ajax学习笔记01
  • Jinja2----------过滤器的使用、控制语句
  • 面试了1个自动化测试,开口40W年薪,只能说痴人做梦...
  • 冲鸭!33% 程序员月薪达到 5 万元以上~
  • 【RSA】HTTPS中SSL/TLS握手时RSA前后端加密流程
  • clion在linux设置桌面启动图标(jetbrains全家桶均适用)
  • Java数据结构LinkedList单链表和双链表模拟实现及相关OJ题秒AC总结知识点
  • 立创EDA 学习 day01 应用下载安装,基本使用的操作
  • 华为OD机试真题Python实现【火星文计算】真题+解题思路+代码(20222023)
  • yolov8 修改类别 自定义数据集
  • Linux环境下验证python项目
  • MAC开发使用技巧
  • 第三章-OpenCV基础-7-形态学
  • DeepFaceLab 中Ubuntu(docker gpu) 部署
  • 分析帆软填报报表点提交的逻辑
  • 【ROS学习笔记9】ROS常用API
  • 客户关系管理挑战:如何保持客户满意度并提高业绩?
  • Cartesi 2023 年 2 月回顾
  • 《爆肝整理》保姆级系列教程python接口自动化测试框架(二十六)--批量执行用例 discover(详解)
  • Ubuntu学习篇
  • extern关键字
  • T3 出行云原生容器化平台实践
  • 从0开始学python -44
  • 22- estimater使用 (TensorFlow系列) (深度学习)
  • eKuiper 1.8.0 发布:零代码实现图像/视频流的实时 AI 推理
  • [Ansible系列]ansible JinJia2过滤器