KinectV2は、リアルタイムのカラー画像を取得し、対応する人間の骨格を表示します(注釈付きのC ++コード、C ++リンクライブラリ構成チュートリアルを完備)-行動検出の研究の方向性

KinectV2インストールチュートリアルhttps//blog.csdn.net/weixin_44414948/article/details/112346307
OpenCVインストールおよび構成チュートリアルhttps//blog.csdn.net/weixin_44414948/article/details/112382735

デモゴール

KinectV2が提供するC ++インターフェイスを使用して、リアルタイムのカラー画像を取得し、対応する人間の骨格を表示するコードを記述します。

最初に完全なC ++コードをアップロードします(opencvのC ++リンクライブラリであるKinectV2を構成しない読者は、以下のリンクライブラリ構成チュートリアルを参照できます)。

#include <iostream>
#include <opencv2\imgproc.hpp>	//opencv头文件
#include <opencv2\calib3d.hpp>
#include <opencv2\highgui.hpp>
#include <Kinect.h>	//Kinect头文件

using   namespace   std;
using   namespace   cv;

void draw(Mat & img, Joint & r_1, Joint & r_2, ICoordinateMapper * myMapper);
void kinect_sk();

int main(void)
{
    
    
	kinect_sk();
	return  0;
}

void    draw(Mat & img, Joint & r_1, Joint & r_2, ICoordinateMapper * myMapper)
{
    
    
	//用两个关节点来做线段的两端,并且进行状态过滤
	if (r_1.TrackingState == TrackingState_Tracked && r_2.TrackingState == TrackingState_Tracked)
	{
    
    
		ColorSpacePoint t_point;    //要把关节点用的摄像机坐标下的点转换成彩色空间的点
		Point   p_1, p_2;
		myMapper->MapCameraPointToColorSpace(r_1.Position, &t_point);
		p_1.x = t_point.X;
		p_1.y = t_point.Y;
		myMapper->MapCameraPointToColorSpace(r_2.Position, &t_point);
		p_2.x = t_point.X;
		p_2.y = t_point.Y;

		line(img, p_1, p_2, Vec3b(0, 255, 0), 5);
		circle(img, p_1, 10, Vec3b(255, 0, 0), -1);
		circle(img, p_2, 10, Vec3b(255, 0, 0), -1);
	}
}

void kinect_sk()
{
    
    
	IKinectSensor   * mySensor = nullptr;
	GetDefaultKinectSensor(&mySensor);
	mySensor->Open();

	IColorFrameSource   * myColorSource = nullptr;
	mySensor->get_ColorFrameSource(&myColorSource);

	IColorFrameReader   * myColorReader = nullptr;
	myColorSource->OpenReader(&myColorReader);

	int colorHeight = 0, colorWidth = 0;
	IFrameDescription   * myDescription = nullptr;
	myColorSource->get_FrameDescription(&myDescription);
	myDescription->get_Height(&colorHeight);
	myDescription->get_Width(&colorWidth);

	IColorFrame * myColorFrame = nullptr;
	Mat original(colorHeight, colorWidth, CV_8UC4);

	//**********************以上为ColorFrame的读取前准备**************************

	IBodyFrameSource    * myBodySource = nullptr;
	mySensor->get_BodyFrameSource(&myBodySource);

	IBodyFrameReader    * myBodyReader = nullptr;
	myBodySource->OpenReader(&myBodyReader);

	int myBodyCount = 0;
	myBodySource->get_BodyCount(&myBodyCount);

	IBodyFrame  * myBodyFrame = nullptr;

	ICoordinateMapper   * myMapper = nullptr;
	mySensor->get_CoordinateMapper(&myMapper);

	//**********************以上为BodyFrame以及Mapper的准备***********************
	while (1)
	{
    
    

		while (myColorReader->AcquireLatestFrame(&myColorFrame) != S_OK);
		myColorFrame->CopyConvertedFrameDataToArray(colorHeight * colorWidth * 4, original.data, ColorImageFormat_Bgra);
		Mat copy = original.clone();        //读取彩色图像并输出到矩阵

		while (myBodyReader->AcquireLatestFrame(&myBodyFrame) != S_OK); //读取身体图像
		IBody   **  myBodyArr = new IBody *[myBodyCount];       //为存身体数据的数组做准备
		for (int i = 0; i < myBodyCount; i++)
			myBodyArr[i] = nullptr;

		if (myBodyFrame->GetAndRefreshBodyData(myBodyCount, myBodyArr) == S_OK)     //把身体数据输入数组
			for (int i = 0; i < myBodyCount; i++)
			{
    
    
				BOOLEAN     result = true;
				if (myBodyArr[i]->get_IsTracked(&result) == S_OK && result) //先判断是否侦测到
				{
    
    
					//cout << "Detection is work!" << endl;
					Joint   myJointArr[JointType_Count];
					
					if (myBodyArr[i]->GetJoints(JointType_Count, myJointArr) == S_OK)   //如果侦测到就把关节数据输入到数组并画图
					{
    
    
						draw(copy, myJointArr[JointType_Head], myJointArr[JointType_Neck], myMapper);
						draw(copy, myJointArr[JointType_Neck], myJointArr[JointType_SpineShoulder], myMapper);

						draw(copy, myJointArr[JointType_SpineShoulder], myJointArr[JointType_ShoulderLeft], myMapper);
						draw(copy, myJointArr[JointType_SpineShoulder], myJointArr[JointType_SpineMid], myMapper);
						draw(copy, myJointArr[JointType_SpineShoulder], myJointArr[JointType_ShoulderRight], myMapper);

						draw(copy, myJointArr[JointType_ShoulderLeft], myJointArr[JointType_ElbowLeft], myMapper);
						draw(copy, myJointArr[JointType_SpineMid], myJointArr[JointType_SpineBase], myMapper);
						draw(copy, myJointArr[JointType_ShoulderRight], myJointArr[JointType_ElbowRight], myMapper);

						draw(copy, myJointArr[JointType_ElbowLeft], myJointArr[JointType_WristLeft], myMapper);
						draw(copy, myJointArr[JointType_SpineBase], myJointArr[JointType_HipLeft], myMapper);
						draw(copy, myJointArr[JointType_SpineBase], myJointArr[JointType_HipRight], myMapper);
						draw(copy, myJointArr[JointType_ElbowRight], myJointArr[JointType_WristRight], myMapper);

						draw(copy, myJointArr[JointType_WristLeft], myJointArr[JointType_ThumbLeft], myMapper);
						draw(copy, myJointArr[JointType_WristLeft], myJointArr[JointType_HandLeft], myMapper);
						draw(copy, myJointArr[JointType_HipLeft], myJointArr[JointType_KneeLeft], myMapper);
						draw(copy, myJointArr[JointType_HipRight], myJointArr[JointType_KneeRight], myMapper);
						draw(copy, myJointArr[JointType_WristRight], myJointArr[JointType_ThumbRight], myMapper);
						draw(copy, myJointArr[JointType_WristRight], myJointArr[JointType_HandRight], myMapper);

						draw(copy, myJointArr[JointType_HandLeft], myJointArr[JointType_HandTipLeft], myMapper);
						draw(copy, myJointArr[JointType_KneeLeft], myJointArr[JointType_FootLeft], myMapper);
						draw(copy, myJointArr[JointType_KneeRight], myJointArr[JointType_FootRight], myMapper);
						draw(copy, myJointArr[JointType_HandRight], myJointArr[JointType_HandTipRight], myMapper);
					}
				}
			}
		delete[]myBodyArr;
		myBodyFrame->Release();
		myColorFrame->Release();

		imshow("TEST", copy);
		if (waitKey(30) == VK_ESCAPE)
			break;
	}

	myMapper->Release();

	myDescription->Release();
	myColorReader->Release();
	myColorSource->Release();

	myBodyReader->Release();
	myBodySource->Release();
	mySensor->Close();
	mySensor->Release();
	cv::destroyAllWindows();
}

実行結果:
ここに画像の説明を挿入

KinectV2、OpenCV C ++リンクライブラリ構成:

vs2015でプロパティマネージャーファイルをセットアップすることを選択し、それを構成した後、次回使用するときに、Release / x64に直接スローします。
1.次の図に示すように、vs2015のプロパティマネージャーを見つけます。
ここに画像の説明を挿入
2. Release / x64に新しいプロジェクト属性テーブルを追加します(注:私はリリースモードです。リーダーがデバッグの場合は、対応するデバッグを選択してください)。
ここに画像の説明を挿入
3.任意の名前を付けます。便宜上、Kinect-cvという名前を付けました。詳細な設定手順は次のとおりです
。3.1。vc++ディレクトリの下にインクルードディレクトリとライブラリディレクトリを設定します。次の図は、インクルードディレクトリとライブラリディレクトリを示しています。 、読者独自のOpenCV対応パスに変更するだけです。ここに画像の説明を挿入

OpenCVがCドライブのルートディレクトリに直接インストールされている場合、インクルードディレクトリは次のとおりです
。C:
\ opencv \ build \ include \ opencv
C:\ opencv \ build \ include \ opencv2 C:\ opencv \ build \ include

ここに画像の説明を挿入

OpenCVが
Cドライブのルートディレクトリに直接インストールされている場合、ライブラリディレクトリは次のとおりです。C:\ opencv \ build \ x64 \ vc14 \ lib

ここに画像の説明を挿入
3.2。c / c ++の設定|一般|追加のインクルードディレクトリ、設定内容は次のとおりです(Kinect SDK2.0がデフォルトでインストールされている場合は、私のものとして設定できます。デフォルトでない場合は、次のように変更する必要があります。対応するパス)。
ここに画像の説明を挿入
ここに画像の説明を挿入
3.3。リンカー|一般|追加のライブラリディレクトリを設定します(Kinect SDK2.0がデフォルトでインストールされている場合は、私のものとして設定できます。デフォルトでない場合は、対応するパスに変更する必要があります)。
ここに画像の説明を挿入
ここに画像の説明を挿入
3.4。OpenCVとKinectSDKのバージョン番号に従って設定されたリンカー|入力|追加の依存関係を設定します(私はOpenCV3.4ですが、Kinect20.libは同じままです)。
ここに画像の説明を挿入

説明は次のとおりです:opencv_world340.libとopencv_world340d.libは、それぞれリリースモードとデバッグモードで呼び出される静的リンクファイルです。モードの切り替えを防ぐために、両方を追加してから、リリースプロパティマネージャーとデバッグプロパティマネージャーの両方でこのkinectを追加します。 cvプロジェクトプロパティファイル。

ここに画像の説明を挿入
4.これまでのところ、すべてのC ++リンクライブラリが構成されています。次の使用を容易にするために、既存のプロジェクトプロパティシートKinect-cvを最新プロジェクトのプロパティマネージャーに直接追加できます。
ここに画像の説明を挿入
ここに画像の説明を挿入

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44414948/article/details/112347616