KinectV2 实现鼠标控制VS2013 C++版


这里提供一个kinectV2控制鼠标的C++版本程序,同时包含Chengaotan版本的C#程序供参考,Kinect 自身可实现三种手势的识别,拳头,剪刀,和布,从而可控制鼠标做不同的事情;本人已将其运用到体感游戏打飞机上,效果不错,附上打飞机体感游戏博客地址:http://blog.csdn.net/qq_34609108/article/details/78082849
资源截图
代码片段和文件信息
#include “KinectControl.h“
#include 
#include 

int KinectControl::lassoCount = 0;

KinectControl::KinectControl():   //各种类型变量的初始化

mouseSensitivity ( MOUSE_SENSITIVITY)
timeRequired (TIME_REQUIRED)
doClick (DO_CLICK)
useGripGesture (USE_GRIP_GESTURE)
cursorSmoothing ( CURSOR_SMOOTHING)
{
alreadyTrackedPos = false; 
wasLeftGrip = false; 
wasRightGrip = false; 
lasso = false;
lastCurPos = { 0 0 };
m_pSensor           = nullptr;
m_pframeDescription = nullptr;
m_pBodySource = nullptr;
m_pBodyReader = nullptr;
m_pBodyframe  = nullptr;

// 获取屏幕的大小与尺寸
 screenWidth = GetSystemMetrics(SM_CXSCREEN);
 screenHeight = GetSystemMetrics(SM_CYSCREEN);

}
HRESULT KinectControl::InitializeDefaultSensor()
{
//kinect Body帧的准备,直接开好Reader
HRESULT hr;
hr = GetDefaultKinectSensor(&m_pSensor);
if (FAILED(hr))
{
return hr;
}
if (m_pSensor)
{
hr = m_pSensor->Open();
m_pSensor->get_BodyframeSource(&m_pBodySource);
m_pBodySource->OpenReader(&m_pBodyReader);
}
return hr;
}

//主要数据更新区域
void  KinectControl::Update()
{
//因为每0.1秒循环,用lasso 也就是手势剪刀来标记 鼠标双击 , 一次点击按下,要2秒等待,实现下一次点击,否则剪刀手势下一直点击
if (lasso) lassoCount++;
if (lassoCount > 20)
 {
 lassoCount = 0;
 lasso = false;
 }


while (m_pBodyReader->AcquireLatestframe(&m_pBodyframe) != S_OK); //读取Body数据
int bodyBufferSize = 0;
m_pBodySource->get_BodyCount(&bodyBufferSize);
IBody ** bodyArray = new IBody *[bodyBufferSize];
for (int i = 0; i < bodyBufferSize; i++)
{
bodyArray[i] = nullptr;
}
m_pBodyframe->GetAndRefreshBodyData(bodyBufferSize bodyArray);

for (int i = 0; i < bodyBufferSize; i++)  //遍历6个人
{
BOOLEAN result = false;
if (bodyArray[i]->get_IsTracked(&result) == S_OK && result)
{
Joint jointArray[JointType_Count]; //将关节点输出,正式开始处理
bodyArray[i]->GetJoints(JointType_Count jointArray);
if (jointArray[JointType_Neck].TrackingState != TrackingState_Tracked ||
jointArray[JointType_Head].TrackingState != TrackingState_Tracked)
continue;

CameraSpacePoint handLeft = jointArray[JointType_HandLeft].Position;    //左手掌
CameraSpacePoint spinebase = jointArray[JointType_Spinebase].Position;  //脊椎基部
CameraSpacePoint handRight = jointArray[JointType_HandRight].Position;  //右手掌


if (handRight.Z - spinebase.Z < -0.15f) // if right hand lift forward
{
/*如果是右手按此计算。我们不使用肩膀的位置作为参考,因为导致右肩膀通常是在举起的右手后面,位置将被推断和不稳定。
因为脊柱的基础是在右手的左边,我们加0.05f使其更加接近权*/

float x = handRight.X - spinebase.X + 0.05f;
/* hand y calculated by this. ss spine base is way lower than right hand we plus 0.51f to make it
* higer the value 0.51f is worked out by testing for a several times you can set it as another one you like. */
float y = spinebase.Y - handRight.Y + 0.51f;
// get current cursor position
POINT curPos;
GetCursorPos(&curPos);
// smoothing for using should be 0 - 0.95f. Th

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-10-25 08:42  MyKinectTouch
     目录           0  2017-10-25 08:14  MyKinectTouchDebug
     文件       73728  2017-10-25 08:42  MyKinectTouchDebugMyKinectTouch.exe
     文件      528872  2017-10-25 08:42  MyKinectTouchDebugMyKinectTouch.ilk
     文件     2289664  2017-10-25 08:42  MyKinectTouchDebugMyKinectTouch.pdb
     目录           0  2017-10-25 08:42  MyKinectTouchMyKinectTouch
     目录           0  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebug
     文件      199670  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugKinectControl.obj
     文件       39080  2017-09-19 16:29  MyKinectTouchMyKinectTouchDebugMouseControl.obj
     文件        2462  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugMyKinectTouch.log
     文件      170589  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugMyKinectTouch.obj
     目录           0  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugMyKinectTouch.tlog
     文件      128334  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugMyKinectTouch.tlogCL.read.1.tlog
     文件        5728  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugMyKinectTouch.tlogCL.write.1.tlog
     文件         174  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugMyKinectTouch.tlogMyKinectTouch.lastbuildstate
     文件        5152  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugMyKinectTouch.tlogcl.command.1.tlog
     文件        9502  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugMyKinectTouch.tloglink.command.1.tlog
     文件       14216  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugMyKinectTouch.tloglink.read.1.tlog
     文件        2220  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugMyKinectTouch.tloglink.write.1.tlog
     文件     1739776  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugvc120.idb
     文件     1667072  2017-10-25 08:42  MyKinectTouchMyKinectTouchDebugvc120.pdb
     文件        6584  2017-10-25 08:42  MyKinectTouchMyKinectTouchKinectControl.cpp
     文件        1892  2017-10-25 08:42  MyKinectTouchMyKinectTouchKinectControl.h
     文件        1368  2017-09-18 14:49  MyKinectTouchMyKinectTouchMyKinectTouch.aps
     文件         677  2017-10-25 08:26  MyKinectTouchMyKinectTouchMyKinectTouch.cpp
     文件        4222  2017-09-19 16:33  MyKinectTouchMyKinectTouchMyKinectTouch.vcxproj
     文件        1177  2017-09-19 16:33  MyKinectTouchMyKinectTouchMyKinectTouch.vcxproj.filters
     文件    34406400  2017-10-25 08:42  MyKinectTouchMyKinectTouch.sdf
     文件         985  2017-09-18 14:43  MyKinectTouchMyKinectTouch.sln
     文件       38912  2017-10-25 08:42  MyKinectTouchMyKinectTouch.v12.suo
     目录           0  2017-10-25 08:14  MyKinectTouchWpfApplication1 C#版应用程序
............此处省略53个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)