基于2D的人脸跟踪显示
2017-12-01 15:53
225 查看
// FaceTrack.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "opencv2/opencv.hpp" #include "Kinect.h" #include "kinect.face.h" using namespace cv; using namespace std; //#pragma comment ( lib, "Kinect20.face.lib" ) //安全释放指针 template<class Interface> inline void SafeRelease(Interface *& pInterfaceToRelease) { if (pInterfaceToRelease != NULL) { pInterfaceToRelease->Release(); pInterfaceToRelease = NULL; } } int _tmain(int argc, _TCHAR* argv[]) { IKinectSensor *kinectSensor; HRESULT hr = GetDefaultKinectSensor(&kinectSensor); kinectSensor->Open(); //开启深度数据获取 IDepthFrameSource* depths = nullptr; kinectSensor->get_DepthFrameSource(&depths); // 获取深度数据源 int height, width; //图像宽和高 IFrameDescription * myDescription = nullptr; //取得深度数据的分辨率 depths->get_FrameDescription(&myDescription); myDescription->get_Height(&height); myDescription->get_Width(&width); myDescription->Release(); IDepthFrameReader* depthRead = nullptr; depths->OpenReader(&depthRead); // 打开深度解析器 cout << "width " << width << " height " << height << endl; Mat img16u(height,width,CV_16UC1); Mat img8u(height,width,CV_8UC1); //开启彩色数据获取 IColorFrameSource* colorFramSouce = nullptr; kinectSensor->get_ColorFrameSource(&colorFramSouce); // 获取图像数据源 IColorFrameReader* colorFramRead = nullptr; colorFramSouce->OpenReader(&colorFramRead); // 打开解析器 IFrameDescription* frameDs = nullptr; colorFramSouce->get_FrameDescription(&frameDs); // 获取信息的属性 int heightColor, widthColor; frameDs->get_Height(&heightColor); frameDs->get_Width(&widthColor); cout << "heightColor " << heightColor << " widthColor " << widthColor << endl; Mat imgColor(heightColor, widthColor, CV_8UC4); //开启骨骼数据获取 IBodyFrameSource * myBodySource = nullptr; //source kinectSensor->get_BodyFrameSource(&myBodySource); int heightBody, widthBody; IBodyFrameReader * myBodyReader = nullptr; //reader myBodySource->OpenReader(&myBodyReader); int myBodyCount = 0; myBodySource->get_BodyCount(&myBodyCount); ICoordinateMapper * myMapper = nullptr; kinectSensor->get_CoordinateMapper(&myMapper); //脸部跟踪 IFaceFrameSource * myFaceSource[BODY_COUNT]; //kinectSensor->get_FaceFrameFeatures(&myBodySource); DWORD features = FaceFrameFeatures::FaceFrameFeatures_BoundingBoxInColorSpace | FaceFrameFeatures::FaceFrameFeatures_PointsInColorSpace | FaceFrameFeatures::FaceFrameFeatures_RotationOrientation; //| FaceFrameFeatures::FaceFrameFeatures_Happy //| FaceFrameFeatures::FaceFrameFeatures_RightEyeClosed //| FaceFrameFeatures::FaceFrameFeatures_LeftEyeClosed //| FaceFrameFeatures::FaceFrameFeatures_MouthOpen //| FaceFrameFeatures::FaceFrameFeatures_MouthMoved //| FaceFrameFeatures::FaceFrameFeatures_LookingAway //| FaceFrameFeatures::FaceFrameFeatures_Glasses //| FaceFrameFeatures::FaceFrameFeatures_FaceEngagement; IFaceFrameReader* faceReader[BODY_COUNT]; for (int i = 0; i < BODY_COUNT; i++) { if (CreateFaceFrameSource(kinectSensor, 0, features, &myFaceSource[i]) != S_OK) { std::cerr << "Error : CreateFaceFrameSource" << std::endl; return -1; } myFaceSource[i]->OpenReader(&faceReader[i]); } //循环获取 while (true) { //获取深度摄像头数据 IDepthFrame* depthFram = nullptr; if (depthRead->AcquireLatestFrame(&depthFram) == S_OK) //通过Reader尝试获取最新的一帧深度数据,放入深度帧中,并判断是否成功获取 { depthFram->CopyFrameDataToArray(height * width, (UINT16 *)img16u.data); //先把数据存入16位的图像矩阵中 img16u.convertTo(img8u, CV_8UC1, 255.0 / 4500); //再把16位转换为8位 imshow("TEST", img8u); depthFram->Release(); } //获取RGB摄像头数据 IColorFrame* colorFram = nullptr; if (colorFramRead->AcquireLatestFrame(&colorFram) == S_OK) //通过Reader尝试获取最新的一帧深度数据,放入深度帧中,并判断是否成功获取 { colorFram->CopyConvertedFrameDataToArray(heightColor*widthColor * 4, (BYTE*)imgColor.data, ColorImageFormat_Bgra); colorFram->Release(); } //获取人骨胳数据 IBodyFrame *myBodyFrame = nullptr; if (myBodyReader->AcquireLatestFrame(&myBodyFrame) == S_OK) { myBodyCount = 0; IBody ** bodyArr = nullptr; myBodySource->get_BodyCount(&myBodyCount); bodyArr = new IBody *[myBodyCount]; for (int i = 0; i < myBodyCount; i++) //bodyArr的初始化 bodyArr[i] = nullptr; if (myBodyFrame->GetAndRefreshBodyData(myBodyCount, bodyArr) == S_OK) { for (int i = 0; i < myBodyCount; i++) //遍历6个人(可能用不完) { BOOLEAN result = false; if (bodyArr[i]->get_IsTracked(&result) == S_OK && result) //判断此人是否被侦测到 { cout << "Body " << i << " tracked!" << endl; UINT64 trackingId = _UI64_MAX; if (bodyArr[i]->get_TrackingId(&trackingId) == S_OK) { myFaceSource[i]->put_TrackingId(trackingId); } } } } for (int i = 0; i < myBodyCount; i++) { IFaceFrame*faceFrame = nullptr; if (faceReader[i]->AcquireLatestFrame(&faceFrame) == S_OK && faceFrame != nullptr) { BOOLEAN tracked = false; if (SUCCEEDED(faceFrame->get_IsTrackingIdValid(&tracked)) && tracked) { IFaceFrameResult *faceResult = nullptr; if (SUCCEEDED(faceFrame->get_FaceFrameResult(&faceResult))) { PointF facePoint[FacePointType_Count]; //FacePointType_Count=5 if (SUCCEEDED(faceResult->GetFacePointsInColorSpace(FacePointType_Count, facePoint))) { for (int j = 0; j <FacePointType_Count; j++) { circle(imgColor, Point(facePoint[j].X, facePoint[j].Y), 5, Scalar(0, 0, 255), 5); } //cout << "facePoint" << facePoint.size() << endl; } RectI box; if (SUCCEEDED(faceResult->get_FaceBoundingBoxInColorSpace(&box))) { rectangle(imgColor, cv::Rect(box.Left, box.Top, box.Right - box.Left, box.Bottom - box.Top), Scalar(0, 0, 255, 255),5); } faceResult->Release(); } } } //CreateFaceModel(); //UINT32 triangel[4]; //GetFaceModelTriangles(heightColor*widthColor, triangel); //delete[] bodyArr; imshow("imgColor", imgColor); } myBodyFrame->Release(); } waitKey(1); } //img show Mat src=imread("1.jpg"); imshow("lk", src); waitKey(); depthRead->Release(); //释放不用的变量并且关闭感应器 colorFramRead->Release(); kinectSensor->Close(); return 0; }
只显示脸部的5个主要特征点
相关文章推荐
- 基于OpenCV和wxWidgets实现人脸跟踪
- 工程实践总结(基于USB的人脸识别与跟踪)和基于USB的运动目标运动跟踪
- 基于粒子滤波的人脸跟踪实现------立项篇
- 基于PCA的改进人脸识别算法—2DPCA(上篇)
- 人脸跟踪三维点云获取及三角面片分割显示(kinect2.0 SDK开发 )
- 基于2D-RNN的鲁棒行人跟踪
- Matlab基于主分量的人脸重建显示
- Windows CE LCD显示驱动简析(2)(基于WinCE5.0 SMDK2410 BSP的LCD显示设备驱动)
- 非刚性人脸跟踪 —— 人脸检测与初始化
- MM--关于MIRO的分析基于订单的发票校验的跟踪
- 基于2D多边形的碰撞检测和响应(四)
- 基于Framebuffer显示的ZBar开源软件的移植
- PixiJS - 基于 WebGL 的超快 HTML5 2D 渲染引擎
- cocos2d-x 基于CCClippingNode实现CCLayer遮罩功能,在滑动时超出剪切区域的实现显示部分的效果,不需要再借助其他sprite来遮挡了
- [转]基于粒子滤波的物体跟踪
- ios中基于科大讯飞SDK进行人脸装扮
- OpenCV与Compressive Tracking实现人脸的实时检测与跟踪
- 基于地图的短信追踪小练习(7)经纬度的设置与显示
- 一篇基于opencv的人脸识别文章
- 引擎设计跟踪(九.14.2d) [翻译] shader的跨平台方案之2014