日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

谈谈NITE 2与OpenCV结合的第二个程序(提取人体骨骼坐标)

發(fā)布時間:2025/4/16 编程问答 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 谈谈NITE 2与OpenCV结合的第二个程序(提取人体骨骼坐标) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??? 溫故而知新——NITE 2的基本使用主要包括以下幾個步驟:

??? 1. 初始化NITE環(huán)境: nite::NiTE::initialize();

??? 2. 創(chuàng)建User跟蹤器: nite::UserTracker mUserTracker; mUserTracker.create();

??? 3. 創(chuàng)建并讀取User Frame信息:nite::UserTrackerFrameRef mUserFrame; mUserTracker.readFrame( &mUserFrame );

??? 4. 從User Frame信息中獲取User信息:? const nite::Array<nite::UserData>& aUsers = mUserFrame.getUsers();然后根據(jù)User信息開始人體骨骼跟蹤識別。

??? 5. 釋放Frame信息:mUserFrame.release();

??? 6. 關閉跟蹤器:mUserTracker.destroy();

??? 7. 最后關閉NITE環(huán)境:nite::NiTE::shutdown();

下面是簡單的右手骨骼坐標跟蹤,并顯示右手坐標信息的程序代碼:

// YeNITE2SimpleUsingOpenCV_Skeleton.cpp : 定義控制臺應用程序的入口點。 // #include "stdafx.h" #include <iostream>// 載入NiTE.h頭文件 #include <NiTE.h>// using namespace using namespace std;int main( int argc, char** argv ) {// 初始化NITE nite::NiTE::initialize();// 創(chuàng)建User跟蹤器 nite::UserTracker mUserTracker;mUserTracker.create();nite::UserTrackerFrameRef mUserFrame;for( int i = 0; i < 1000; ++ i ){// 讀取User Frame信息mUserTracker.readFrame( &mUserFrame );// 從User Frame信息中獲取User信息const nite::Array<nite::UserData>& aUsers = mUserFrame.getUsers();// Frame中User的個數(shù)for( int i = 0; i < aUsers.getSize(); ++ i ){const nite::UserData& rUser = aUsers[i];// 當有User用戶出現(xiàn)在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 ){// 得到右手坐標const nite::SkeletonJoint& righthand= rSkeleton.getJoint( nite::JOINT_RIGHT_HAND );const nite::Point3f& position = righthand.getPosition();cout << "右手坐標: " << position.x << "/" << position.y << "/" << position.z << endl;}}}// 釋放 mUserFrame.release(); // 關閉跟蹤器 mUserTracker.destroy();// 關閉NITE環(huán)境 nite::NiTE::shutdown();return 0; }

??? 程序執(zhí)行結果如下:

??? 但通過對上述程序代碼觀察發(fā)現(xiàn),在對人體骨骼跟蹤的時候,未做出(“投降”和“雙手抱胸”)的動作,也可以獲取骨骼坐標信息。難道在NITE2骨骼跟蹤的時候,人體姿勢檢測是多余的嗎?這個我的理解是:似乎姿勢跟蹤將會變成雞肋(完全靠自己的想象。。。)。

??? 接著借助于OpenCV等常用工具庫,看看骨骼坐標在深度圖像下的定位和顯示效果,直接上代碼:

// YeNite2SimpleUsingOpenCV.cpp : 定義控制臺應用程序的入口點。 // #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();// 創(chuàng)建User跟蹤器nite::UserTracker* mUserTracker = new nite::UserTracker;mUserTracker->create();// 創(chuàng)建OpenCV圖像窗口namedWindow( "Skeleton Image", CV_WINDOW_AUTOSIZE );// 循環(huán)讀取數(shù)據(jù)流信息并保存在HandFrameRef中 nite::UserTrackerFrameRef mUserFrame;while( true ){// 讀取Frame信息nite::Status rc = mUserTracker->readFrame(&mUserFrame);if (rc != nite::STATUS_OK){cout << "GetNextData failed" << endl;return 0;}// 將深度數(shù)據(jù)轉換成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的個數(shù)for( int i = 0; i < aUsers.getSize(); ++ i ){const nite::UserData& rUser = aUsers[i];// 當有User用戶出現(xiàn)在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::Point point((int)depth_x, (int)depth_y);// 將獲取的深度圖像中相對應的坐標點重新賦值為255.即在深度圖像中顯示出各個骨骼點。thresholdDepth.at<uchar>(point) = 255;}// 顯示圖像cv::imshow( "Skeleton Image", thresholdDepth );}}// 終止快捷鍵if( cv::waitKey(1) == 'q')break;}// 關閉Frame mUserFrame.release();// 關閉跟蹤器mUserTracker->destroy();// 關閉NITE環(huán)境 nite::NiTE::shutdown();return 0; }

上圖: 圖上“白點”就是骨骼點。

??? 需要了解具體的骨骼點信息(位置、方向,以及可靠性等),可以看官網提供的參考文獻。我覺得遺憾的是,目前提供的15個骨骼點坐標不包括了手腕等其它骨骼點、而且只能得到全身的,不能單獨獲取上半身骨骼坐標。

結合程序注釋和之前的博文內容,我想最后一個程序應該挺好理解的。根據(jù)自己的感覺走,感覺寫代碼,沒做封裝、優(yōu)化、重構,完全是面向過程,而且肯定還存在細節(jié)的問題,會在后面進一步優(yōu)化的。

??? 寫的粗糙,歡迎指正批評~~~

?

轉載于:https://www.cnblogs.com/yemeishu/archive/2013/01/16/2862514.html

總結

以上是生活随笔為你收集整理的谈谈NITE 2与OpenCV结合的第二个程序(提取人体骨骼坐标)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。