首页 新闻 会员 周边

所有用到nite.h的代码都显示[下面的框架可能不正确和/或缺失,没有为 NiTE2.dll 加载符号]

-1
悬赏园豆:50 [待解决问题]

显示有问题的语句是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;
}



任凭的主页 任凭 | 初学一级 | 园豆:152
提问于:2015-07-17 17:02
< >
分享
所有回答(1)
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 的话可以得到更多的调用信息。

Launcher | 园豆:45045 (高人七级) | 2015-07-17 17:12

这个代码在我同学的电脑上运行成功了,在我这里就一直这样,我们俩的nite,openni,primesensor的版本都一样。安装顺序也一样,用同样的vs2013,为毛还是不行呢?

支持(0) 反对(0) 任凭 | 园豆:152 (初学一级) | 2015-07-17 19:48

@任凭: 你把这两个函数的原型贴出来,我看下: nite::NiTE::initialize() 和 nite::UserTracker::create()。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-07-20 09:30

@任凭: 请问你的问题解决了吗?我遇到了跟你一样的问题!

支持(0) 反对(0) 唯有功成可诉离殇 | 园豆:200 (初学一级) | 2016-04-25 20:43

@任凭: 同求解决办法

支持(0) 反对(0) 达博斯达 | 园豆:152 (初学一级) | 2016-09-22 10:39

@唯有功成可诉离殇: 同求解决办法

支持(0) 反对(0) 达博斯达 | 园豆:152 (初学一级) | 2016-09-22 10:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册