显示有问题的语句是nite.h中的 Status rc = (Status)niteReadUserTrackerFrame(m_userTrackerHandle,&pNiteFrame);
而muserframe 确实为空值
代码如下
#include "stdafx.h"
#include <iostream>
// 载入NiTE.h头文件
#include <NiTE.h>
// 载入OpenCV头文件
#include "opencv2/opencv.hpp"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
// 初始化NITE
nite::NiTE::initialize();
// 创建User跟踪器
nite::UserTracker* mUserTracker = new nite::UserTracker;
mUserTracker->create();
// 创建OpenCV图像窗口
namedWindow("Skeleton Image", CV_WINDOW_AUTOSIZE);
// 循环读取数据流信息并保存在HandFrameRef中
nite::UserTrackerFrameRef mUserFrame;
while (true)
{
// 读取Frame信息
nite::Status rc = mUserTracker->readFrame(&mUserFrame);
if (rc != nite::STATUS_OK)
{
cout << "GetNextData failed" << endl;
return 0;
}
// 将深度数据转换成OpenCV格式
const cv::Mat mHandDepth(mUserFrame.getDepthFrame().getHeight(), mUserFrame.getDepthFrame().getWidth(), CV_16UC1,
(void*)mUserFrame.getDepthFrame().getData());
// 为了让深度图像显示的更加明显一些,将CV_16UC1 ==> CV_8U格式
cv::Mat mScaledHandDepth, thresholdDepth;
mHandDepth.convertTo(mScaledHandDepth, CV_8U, 255.0 / 10000);
// 二值化处理,为了显示效果明显
cv::threshold(mScaledHandDepth, thresholdDepth, 50, 255, 0);
// 从User Frame信息中获取User信息
const nite::Array<nite::UserData>& aUsers = mUserFrame.getUsers();
// Frame中User的个数
for (int i = 0; i < aUsers.getSize(); ++i)
{
const nite::UserData& rUser = aUsers[i];
// 当有User用户出现在Kinect面前,则判断并显示
if (rUser.isNew())
{
cout << "New User [" << rUser.getId() << "] found." << endl;
// 开始人体骨骼跟踪
mUserTracker->startSkeletonTracking(rUser.getId());
}
// 获取骨骼坐标
const nite::Skeleton& rSkeleton = rUser.getSkeleton();
if (rSkeleton.getState() == nite::SKELETON_TRACKED)
{
// 只得到前8个骨骼点坐标
for (int i = 0; i < 8; i++)
{
// 得到骨骼坐标
const nite::SkeletonJoint& skeletonJoint
= rSkeleton.getJoint((nite::JointType)i);
const nite::Point3f& position = skeletonJoint.getPosition();
float depth_x, depth_y;
// 将骨骼点坐标映射到深度坐标中
mUserTracker->convertJointCoordinatesToDepth(position.x, position.y, position.z, &depth_x, &depth_y);
cv::Point2f point(depth_x, depth_y); // 将获取的深度图像中各个骨骼点相对应的坐标点显示出。
if (skeletonJoint.getPositionConfidence() > 0.5)
cv::circle(thresholdDepth, point, 1, cv::Scalar(255, 0, 255), 2);
else
cv::circle(thresholdDepth, point, 1, cv::Scalar(255, 0, 0), 2);
}
// 显示图像
cv::imshow("Skeleton Image", thresholdDepth);
}
}
// 终止快捷键
if (cv::waitKey(1) == 'q')
break;
}
// 关闭Frame
mUserFrame.release();
// 关闭跟踪器
mUserTracker->destroy();
// 关闭NITE环境
nite::NiTE::shutdown();
return 0;
}
异常应该是 m_userTrackerHandle 为 NULL 所致。
看你的代码:
// 创建User跟踪器
nite::UserTracker* mUserTracker = new nite::UserTracker;
mUserTracker->create();
// 读取Frame信息
nite::Status rc = mUserTracker->readFrame(&mUserFrame);
结合你的截图,m_userTrackerHandle 应该是 UserTracker 的成员变量,也许你调用 create 时并没有正确为 m_userTrackerHandle 设置值或 UserTracker 并没有为其赋值。你应该看看 create 方法的其它重载版本,或者 UserTracker 是否有别的方法设置 m_userTrackerHandle 的值。
PS:所有用到nite.h的代码都显示[下面的框架可能不正确和/或缺失,没有为 NiTE2.dll 加载符号 -〉这个不用管它,只是缺少 pdb 而已,有 pdb 的话可以得到更多的调用信息。
这个代码在我同学的电脑上运行成功了,在我这里就一直这样,我们俩的nite,openni,primesensor的版本都一样。安装顺序也一样,用同样的vs2013,为毛还是不行呢?
@任凭: 你把这两个函数的原型贴出来,我看下: nite::NiTE::initialize() 和 nite::UserTracker::create()。
@任凭: 请问你的问题解决了吗?我遇到了跟你一样的问题!
@任凭: 同求解决办法
@唯有功成可诉离殇: 同求解决办法