KinectV2安装教程:https://blog.csdn.net/weixin_44414948/article/details/112346307
OpenCV安装配置教程:https://blog.csdn.net/weixin_44414948/article/details/112382735
利用KinectV2提供的C++接口,编写代码,获取实时的彩色图像,并显示对应人体骨架。
#include
#include //opencv头文件
#include
#include
#include //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);
// 来自一位博友的问题,没有下面这一句在Debug模式下会卡死
namedWindow("TEST", WINDOW_NORMAL); // Debug模式下一定要加上这一句,因为opencv的窗口show之前一定要给窗口命名,不然后卡死,Release模式这句有没有无所谓。
//**********************以上为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();
}
运行效果:
我们选择在vs2015中设置属性管理器文件,配置好了下次使用时直接往Release/x64里面一扔,一劳永逸。
1、找到vs2015的属性管理器,如下图所示。
2、在Release/x64中添加新的项目属性表(注:我这是release模式,如果读者是debug就选对应的debug)。
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分别为Release和Debug模式下调用的静态链接文件,为了防止切换模式,两个都给他加上,然后Release和Debug的属性管理器下都添加这个kinect-cv项目属性文件。
4、至此,C++的链接库已全部配置完成。为了方便下次使用,直接在最新项目的属性管理器中选择添加现有项目属性表Kinect-cv即可。