windows下qt5 kinect 2.0开发与环境配置
上一次挑战杯我们用kinect1.8做了一个体感3d试衣系统,那时就想用qt来开发了,由于那时候很多东西都不懂,怎么也不知道怎样去配置环境,只能在vs2013中开发,结合qt开发界面。直到出了kinect2.0后才配置成功完全用qt 来开发Kinect!而且完美运行。注意一点就是使用的qt必须是
qt forwindows msvc的才能正常编译。
kinect 2.0开发系统要求:win8.1以上
kinect 1.8开发系统要求:win7以上
工程文件的配置
kinectBasicBuildingExplorer.pro
TEMPLATE = app
QT += qml quick widgets core
SOURCES += main.cpp \
kinect/kinectsensor.cpp
RESOURCES += qml.qrc
Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
Default rules for deployment.
include(deployment.pri)
kinect_V_20 plugin
INCLUDEPATH += $$(KINECTSDK20_DIR)\inc
LIBS += $$(KINECTSDK20_DIR)\Lib\x86\kinect20.lib
kinect_V_20 plugin
CONFIG += no_lflags_merge
某些winapi 的库要用到,(那时候一个个的调才成功,呵)
LIBS += "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\kernel32.lib"
LIBS += "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\user32.lib"
LIBS += "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\gdi32.lib"
LIBS += "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\winspool.lib"
LIBS += "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\comdlg32.lib"
LIBS += "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\advapi32.lib"
LIBS += "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\shell32.lib"
LIBS += "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\oleaut32.lib"
LIBS += "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\uuid.lib"
LIBS += "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\odbc32.lib"
LIBS += "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\odbccp32.lib"
LIBS += "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\ole32.lib"
LIBS += "-LC:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86"
HEADERS += \
kinect/kinectsensor.h
实现kinect功能代码,本代码功能是实现了右手当作鼠标来操控程序,当手握紧相当于鼠标按下左键,当手控制鼠标悬停在某个按钮的时候,相当于鼠标的点击事件。
kinectsensor.h
ifndef KINECTSENSOR_H
define KINECTSENSOR_H
// Windows Header Files必须用到这两个头文件才能使用Kienct api,而且要在Kinect.h之前引用
include
include
// Kinect Header files
include
include
include
include
include
include
include
include
include
include
include
class KinectSensor : public QObject
{
Q_OBJECT
public:
explicit KinectSensor(QObject *parent = 0){
m_pKinectSensor=NULL;
m_pCoordinateMapper=NULL;
m_pBodyFrameReader=NULL;
currentPBody=NULL;
InitializeDefaultSensor();
// bitmap=new QBitmap("qrc:/imgSource/cursor.png");
cursor=new QCursor(Qt::CrossCursor);
cursor->setShape(Qt::DragMoveCursor);
}
/// /// Main processing function/// Q_INVOKABLE void updatebody();/// /// Initializes the default Kinect sensor/// /// S_OK on success, otherwise failure codeQ_INVOKABLE HRESULT InitializeDefaultSensor();/// /// Handle new body data/// timestamp of frame/// body data count/// body data in frame///
// Q_INVOKABLE void ProcessBody(INT64 nTime, int nBodyCount, IBody ppBodies);
Q_INVOKABLE bool getCurrentBody(IBody ppbodies);Q_INVOKABLE void getBodyJoint();Q_INVOKABLE void mapJointsToXYCoord();Q_INVOKABLE QString getLeftHandState();Q_INVOKABLE QString getRightHandState();Q_INVOKABLE float getLeftHandx(){ return leftHandPoint.X;}Q_INVOKABLE float getLeftHandy(){ return leftHandPoint.Y;}Q_INVOKABLE float getRightHandx(){ return rightHandPoint.X;}Q_INVOKABLE float getRightHandy(){ return rightHandPoint.Y;}Q_INVOKABLE void setWinPos(int x,int y){ winx=x; winy=y;}Q_INVOKABLE void refreshMousePos(int mousex,int mousey){ cursor->setPos(mousex,mousey);}Q_INVOKABLE void sendMouseLeftPressEvent(){ QPoint pos; pos.setX(cursor->pos().x()); pos.setY(cursor->pos().y()); QMouseEvent *mevent=new QMouseEvent(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QApplication::sendEvent(QApplication::focusWindow(),mevent); delete mevent;}Q_INVOKABLE void sendMouseLeftReleaseEvent(){ QPoint pos; pos.setX(cursor->pos().x()); pos.setY(cursor->pos().y()); QMouseEvent *mevent=new QMouseEvent(QEvent::MouseButtonRelease, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QApplication::sendEvent(QApplication::focusWindow(),mevent); delete mevent;}Q_INVOKABLE void sendMouseDragEvent(){ QPoint pos; pos.setX(cursor->pos().x()); pos.setY(cursor->pos().y()); QMouseEvent *mevent=new QMouseEvent(QEvent::DragMove, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QApplication::sendEvent(QApplication::focusWindow(),mevent); delete mevent;}Q_INVOKABLE void sentMouseRightPressEvent(){}Q_INVOKABLE void sentMouseRightReleaseEvent(){}
// Q_INVOKABLE void sentMouseMoveEvent(){
// QApplication::sendEvent(QApplication::focusObject(),mouseMoveEvent);
// }
Q_INVOKABLE void setnMouseLeftClickEvent(){
QPoint pos;
pos.setX(cursor->pos().x());
pos.setY(cursor->pos().y());
QMouseEvent *mevent=new QMouseEvent(QEvent::MouseButtonDblClick, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QApplication::sendEvent(QApplication::focusWindow(),mevent);
delete mevent;
// QApplication::sendEvent(QApplication::focusObject(),mouseLeftClickEvent);
}
Q_INVOKABLE double getGuestureWidth(){ return (topRightJoint.Position.X-topLeftJoint.Position.X);}Q_INVOKABLE double getCurrentMousePositionx(){ return (rightHandJoint.Position.X-topRightJoint.Position.X)/(((topRightJoint.Position.X-topLeftJoint.Position.X)));}Q_INVOKABLE double getCurrentMousePositiony(){ return (rightHandJoint.Position.Y-((bottomRightJoint.Position.Y+topRightJoint.Position.Y)/2+topRightJoint.Position.Y)/2)/(neckJoint.Position.Y-((bottomRightJoint.Position.Y+topRightJoint.Position.Y)/2+topRightJoint.Position.Y)/2);}Q_INVOKABLE bool hasTrackingBody(){ if(currentPBody){ return true; }else{ return false; }}
signals:
public slots:
private:
// Current KinectIKinectSensor* m_pKinectSensor;ICoordinateMapper* m_pCoordinateMapper;IBody *currentPBody;//hand stateHandState leftHandState=HandState_Unknown;HandState rightHandState=HandState_Unknown;//hand joint (get both hands's position)Joint leftHandJoint;Joint rightHandJoint;Joint topRightJoint;Joint bottomRightJoint;Joint topLeftJoint;Joint headJoint;Joint neckJoint;//hand color positionColorSpacePoint leftHandPoint;ColorSpacePoint rightHandPoint;// Body readerIBodyFrameReader* m_pBodyFrameReader;QCursor *cursor;int winx;int winy;
};
endif // KINECTSENSOR_H
kinectsensor.cpp
include "kinectsensor.h"
include
// Safe release for interfaces
template
inline void SafeRelease(Interface *& pInterfaceToRelease)
{
if (pInterfaceToRelease != NULL)
{
pInterfaceToRelease->Release();
pInterfaceToRelease = NULL;
}
}
//KinectSensor::KinectSensor(QObject *parent) : QObject(parent)
//{
//}
void KinectSensor::updatebody(){
if (!m_pBodyFrameReader){ return;}IBodyFrame* pBodyFrame = NULL;HRESULT hr = m_pBodyFrameReader->AcquireLatestFrame(&pBodyFrame);if (SUCCEEDED(hr)){ INT64 nTime = 0; hr = pBodyFrame->get_RelativeTime(&nTime); //body position IBody* ppBodies[BODY_COUNT]={0}; if (SUCCEEDED(hr)) { hr = pBodyFrame->GetAndRefreshBodyData(_countof(ppBodies), ppBodies); } if (SUCCEEDED(hr)) {
// ProcessBody(nTime, BODY_COUNT, ppBodies);
getCurrentBody(ppBodies);
// qDebug()get_HandLeftState(&leftHandState);
currentPBody->get_HandRightState(&rightHandState);
}
for (int i = 0; i Open(); if (SUCCEEDED(hr)) { hr = m_pKinectSensor->get_CoordinateMapper(&m_pCoordinateMapper); } if (SUCCEEDED(hr)) { hr = m_pKinectSensor->get_BodyFrameSource(&pBodyFrameSource); } if (SUCCEEDED(hr)) { hr = pBodyFrameSource->OpenReader(&m_pBodyFrameReader); } SafeRelease(pBodyFrameSource);}if (!m_pKinectSensor || FAILED(hr)){
// SetStatusMessage(L"No ready Kinect found!", 10000, true);
qDebug()BeginDraw();
// m_pRenderTarget->Clear();
// RECT rct;
// GetClientRect(GetDlgItem(m_hWnd, IDC_VIDEOVIEW), &rct);
// int width = rct.right;
// int height = rct.bottom;
// for (int i = 0; i get_IsTracked(&bTracked);
// if (SUCCEEDED(hr) && bTracked)
// {
// Joint joints[JointType_Count];
// D2D1_POINT_2F jointPoints[JointType_Count];
// HandState leftHandState = HandState_Unknown;
// HandState rightHandState = HandState_Unknown;
// pBody->get_HandLeftState(&leftHandState);
// pBody->get_HandRightState(&rightHandState);
// hr = pBody->GetJoints(_countof(joints), joints);
// if (SUCCEEDED(hr))
// {
// for (int j = 0; j EndDraw();
// // Device lost, need to recreate the render target
// // We'll dispose it now and retry drawing
// if (D2DERR_RECREATE_TARGET == hr)
// {
// hr = S_OK;
// DiscardDirect2DResources();
// }
// }
// if (!m_nStartTime)
// {
// m_nStartTime = nTime;
// }
// double fps = 0.0;
// LARGE_INTEGER qpcNow = {0};
// if (m_fFreq)
// {
// if (QueryPerformanceCounter(&qpcNow))
// {
// if (m_nLastCounter)
// {
// m_nFramesSinceUpdate++;
// fps = m_fFreq * m_nFramesSinceUpdate / double(qpcNow.QuadPart - m_nLastCounter);
// }
// }
// }
// WCHAR szStatusMessage[64];
// StringCchPrintf(szStatusMessage, _countof(szStatusMessage), L" FPS = %0.2f Time = %I64d", fps, (nTime - m_nStartTime));
// if (SetStatusMessage(szStatusMessage, 1000, false))
// {
// m_nLastCounter = qpcNow.QuadPart;
// m_nFramesSinceUpdate = 0;
// }
// }
//}
bool KinectSensor::getCurrentBody(IBody ppbodies){
for(int a=0;aget_IsTracked(&btracked);
if(SUCCEEDED(hr)&&btracked){
// qDebug()GetJoints(_countof(joints), joints);
if(SUCCEEDED(hr)){
leftHandJoint=joints[JointType_HandLeft];
rightHandJoint=joints[JointType_HandRight];
topRightJoint=joints[JointType_ShoulderRight]; bottomRightJoint=joints[JointType_HipRight]; topLeftJoint=joints[JointType_ShoulderLeft]; headJoint=joints[JointType_Head]; neckJoint=joints[JointType_Neck]; }}
}
void KinectSensor::mapJointsToXYCoord(){
m_pKinectSensor->get_CoordinateMapper(&m_pCoordinateMapper);
if(m_pCoordinateMapper){
m_pCoordinateMapper->MapCameraPointToColorSpace(leftHandJoint.Position,&leftHandPoint);
m_pCoordinateMapper->MapCameraPointToColorSpace(rightHandJoint.Position,&rightHandPoint);
}
}
QString KinectSensor::getLeftHandState(){
if(leftHandState==HandState_Unknown){ return "HandState_Unknown";}else if(leftHandState==HandState_NotTracked){ return "HandState_NotTracked";}else if(leftHandState==HandState_Open){ return "HandState_Open";}else if(leftHandState==HandState_Closed){ return "HandState_Closed";}else if(leftHandState==HandState_Lasso){ return "HandState_Lasso";}else { return "I don't know hell";}
}
QString KinectSensor::getRightHandState(){
if(rightHandState==HandState_Unknown){ return "HandState_Unknown";}else if(rightHandState==HandState_NotTracked){ return "HandState_NotTracked";}else if(rightHandState==HandState_Open){ return "HandState_Open";}else if(rightHandState==HandState_Closed){ return "HandState_Closed";}else if(rightHandState==HandState_Lasso){ return "HandState_Lasso";}else { return "I don't know hell";}
}
kinect 相关资源网站:kinect for windows
c++# qt5, kinect, windows
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!