一.代码声明

下面的代码是博主参考了Intel realsense官方SDK和官方例程后写的一段较为简单的代码,实现了简单的多人脸实时检测及跟踪功能。官方的人脸检测例程功能较多,但代码量很大,阅读起来也较困难,所以博主写了一段较为精简的人脸检测代码。

二.具体代码

  1. #include <pxcsensemanager.h>
  2. #include <pxcsession.h>
  3. #include "util_render.h"
  4. #include <iostream>
  5. #include <string>
  6. #include <stdio.h>
  7. #include <opencv2\opencv.hpp>
  8. #include <windows.h>
  9. #define WIDTH 640
  10. #define HEIGHT 480
  11. using namespace cv;
  12. using namespace std;
  13. void DrawRectangle(Mat &img, Rect box)
  14. {
  15. rectangle(img, box, Scalar(255, 255, 0),2);
  16. }
  17. int main(int argc, char** argv)
  18. {
  19. PXCSenseManager *psm = 0;
  20. psm = PXCSenseManager::CreateInstance();
  21. if (!psm)
  22. {
  23. wprintf_s(L"Unabel to create the PXCSenseManager\n");
  24. return 1;
  25. }
  26. //使能人脸跟踪
  27. psm->EnableFace();
  28. // 初始化管道
  29. psm->Init();
  30. //得到一个人脸模块的实例
  31. PXCFaceModule *faceModule = psm->QueryFace();
  32. if (faceModule == NULL)
  33. {
  34. wprintf_s(L"Unabel to query FaceModule\n");
  35. return 3;
  36. }
  37. //创建一个人脸追踪模块动态配置的实例
  38. PXCFaceConfiguration *cfg = faceModule->CreateActiveConfiguration();
  39. if (cfg == NULL)
  40. {
  41. wprintf_s(L"Unabel to create FaceConfiguration\n");
  42. return 4;
  43. }
  44. cfg->detection.isEnabled = TRUE; //这句也可注释掉,不影响检测结果
  45. //使能所有警告
  46. cfg->EnableAllAlerts();
  47. //将任何参数的改变反馈给faceModule
  48. cfg->ApplyChanges();
  49. //创建人脸数据的实例
  50. PXCFaceData *facedata = faceModule->CreateOutput();
  51. PXCImage *colorIm;
  52. PXCImage::ImageData color_data;
  53. PXCImage::ImageInfo color_info;
  54. while (psm->AcquireFrame(true) >= PXC_STATUS_NO_ERROR)
  55. {
  56. if (psm->AcquireFrame(true) < PXC_STATUS_NO_ERROR) break;
  57. //获取最新的人脸追踪配置参数
  58. facedata->Update();
  59. PXCCapture::Sample *sample = psm->QuerySample();
  60. colorIm = sample->color;
  61. if (colorIm->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_RGB24, &color_data) < PXC_STATUS_NO_ERROR)
  62. wprintf_s(L"未正常获取彩色图\n");
  63. color_info = sample->color->QueryInfo();
  64. Mat color(Size(color_info.width, color_info.height), CV_8UC3, (void*)color_data.planes[0], color_data.pitches[0] / sizeof(uchar));
  65. //取出检测到的人脸数目
  66. pxcI32 nfaces = facedata->QueryNumberOfDetectedFaces();
  67. //对视野内每一张人脸追踪处理
  68. for (pxcI32 i = 0; i < nfaces; i++) {
  69. //按序号获取一个人脸的数据实例
  70. PXCFaceData::Face *trackedface = facedata->QueryFaceByIndex(i);
  71. PXCFaceData::DetectionData *detectiondata = trackedface->QueryDetection();
  72. if (detectiondata == NULL)
  73. {
  74. wprintf_s(L"Unabel to get detection data\n");
  75. return 5;
  76. }
  77. //将当前人脸的位置数据存在rect中
  78. PXCRectI32 rect;
  79. detectiondata->QueryBoundingRect(&rect);
  80. //PXCRectI32到opencv中Rect类的转化
  81. Rect cvrect = Rect(rect.x, rect.y, rect.w, rect.h);
  82. DrawRectangle(color, cvrect);
  83. //给当前人脸加上识别序号的文字
  84. stringstream ss;
  85. ss << i;
  86. string id = ss.str();
  87. id = "ID:" + id;
  88. putText(color,id, Point(rect.x+rect.w/2, rect.y-rect.h/20), CV_FONT_HERSHEY_COMPLEX, 0.4, Scalar(255, 255, 0));
  89. }
  90. colorIm->ReleaseAccess(&color_data);
  91. stringstream ss;
  92. ss << nfaces;
  93. string  num_faces= ss.str();
  94. num_faces =num_faces + " faces in the field of view.";
  95. putText(color, num_faces, Point(color.rows/20,color.cols/40), CV_FONT_HERSHEY_COMPLEX, 0.5, Scalar(153, 51, 250));
  96. psm->ReleaseFrame();
  97. imshow("face_detection", color);
  98. waitKey(1);
  99. }
  100. facedata->Release();
  101. cfg->Release();
  102. psm->Close();
  103. psm->Release();
  104. }
#include <pxcsensemanager.h>
#include <pxcsession.h>
#include "util_render.h"
#include <iostream>
#include <string>
#include <stdio.h>
#include <opencv2\opencv.hpp>
#include <windows.h> #define WIDTH 640
#define HEIGHT 480 using namespace cv;
using namespace std; void DrawRectangle(Mat &img, Rect box)
{
rectangle(img, box, Scalar(255, 255, 0),2);
} int main(int argc, char** argv)
{
PXCSenseManager *psm = 0;
psm = PXCSenseManager::CreateInstance();
if (!psm)
{
wprintf_s(L"Unabel to create the PXCSenseManager\n");
return 1;
} //使能人脸跟踪
psm->EnableFace(); // 初始化管道
psm->Init(); //得到一个人脸模块的实例
PXCFaceModule *faceModule = psm->QueryFace(); if (faceModule == NULL)
{
wprintf_s(L"Unabel to query FaceModule\n");
return 3;
} //创建一个人脸追踪模块动态配置的实例
PXCFaceConfiguration *cfg = faceModule->CreateActiveConfiguration(); if (cfg == NULL)
{
wprintf_s(L"Unabel to create FaceConfiguration\n");
return 4;
} cfg->detection.isEnabled = TRUE; //这句也可注释掉,不影响检测结果 //使能所有警告
cfg->EnableAllAlerts(); //将任何参数的改变反馈给faceModule
cfg->ApplyChanges(); //创建人脸数据的实例
PXCFaceData *facedata = faceModule->CreateOutput(); PXCImage *colorIm;
PXCImage::ImageData color_data;
PXCImage::ImageInfo color_info; while (psm->AcquireFrame(true) >= PXC_STATUS_NO_ERROR) {
if (psm->AcquireFrame(true) < PXC_STATUS_NO_ERROR) break; //获取最新的人脸追踪配置参数
facedata->Update(); PXCCapture::Sample *sample = psm->QuerySample();
colorIm = sample->color; if (colorIm->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_RGB24, &color_data) < PXC_STATUS_NO_ERROR)
wprintf_s(L"未正常获取彩色图\n"); color_info = sample->color->QueryInfo(); Mat color(Size(color_info.width, color_info.height), CV_8UC3, (void*)color_data.planes[0], color_data.pitches[0] / sizeof(uchar)); //取出检测到的人脸数目
pxcI32 nfaces = facedata->QueryNumberOfDetectedFaces(); //对视野内每一张人脸追踪处理
for (pxcI32 i = 0; i < nfaces; i++) {
//按序号获取一个人脸的数据实例
PXCFaceData::Face *trackedface = facedata->QueryFaceByIndex(i);
PXCFaceData::DetectionData *detectiondata = trackedface->QueryDetection(); if (detectiondata == NULL)
{
wprintf_s(L"Unabel to get detection data\n");
return 5;
} //将当前人脸的位置数据存在rect中
PXCRectI32 rect;
detectiondata->QueryBoundingRect(&rect); //PXCRectI32到opencv中Rect类的转化
Rect cvrect = Rect(rect.x, rect.y, rect.w, rect.h);
DrawRectangle(color, cvrect); //给当前人脸加上识别序号的文字
stringstream ss;
ss << i;
string id = ss.str();
id = "ID:" + id;
putText(color,id, Point(rect.x+rect.w/2, rect.y-rect.h/20), CV_FONT_HERSHEY_COMPLEX, 0.4, Scalar(255, 255, 0));
} colorIm->ReleaseAccess(&color_data); stringstream ss;
ss << nfaces;
string num_faces= ss.str();
num_faces =num_faces + " faces in the field of view.";
putText(color, num_faces, Point(color.rows/20,color.cols/40), CV_FONT_HERSHEY_COMPLEX, 0.5, Scalar(153, 51, 250)); psm->ReleaseFrame();
imshow("face_detection", color);
waitKey(1);
}
facedata->Release();
cfg->Release();
psm->Close();
psm->Release();
}

运行结果和丑照:

三.心得体会

说实话,研究realsense的sdk是略痛苦的,因为可参考的资料实在有限,除了官方sdk就只有一个开发者论坛了。当你上网搜索kinect的相关资料时,可以发现大批大神的研究例程和心得。反过来看realsense,新闻很多,都是说它怎么怎么厉害,但是并没有多少对开发者有参考价值的资料。realsense毫无疑问比kinect强悍,体积又小,但因为发布时间较短,所以大部分人都还在研究这玩意怎么用。

就像上面这个程序,博主在看完sdk关于人脸检测的介绍之后,按照它的框架去码代码,码的时候自己都有点迷糊每一步的意思。最后程序闪退,得不到任何结果,人脸都没有,还检测什么。无奈之下只有看example了,天哪噜,代码量实在大,还有一堆写窗口和按钮的,只能慢慢从里面探索出对自己有用的东西。

看久了也就能看出一些门道了,比如ApplyChanges到底有什么用, 原来FaceConfiguration这个接口一旦创建了,就和FaceModule独立了,使用ApplyChanges是为了在模块配置参数发生变化时能通过update来将最新的配置参数传递给FaceModule。然而一开始,我并有理解这些,所以代码里连update都没有,结果只能是gg。

甚至在刚开始的时候,我的enableface还有配置实例的创建代码都是写在while获取每一帧里面的,后面才理解了人脸模块的使能以及人脸追踪的配置应该在获取图片帧之前完成,然后获取一帧图片之后,更新人脸配置参数,对该帧图片检测人脸,对每一个检测到的人脸进行处理。

总之,路漫漫,博主继续研究去了。

Realsense 人脸识别的更多相关文章

  1. OpenCV人脸识别Eigen算法源码分析

    1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...

  2. OpenCV人脸识别LBPH算法源码分析

    1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻 ...

  3. jQuery 人脸识别插件,支持图片和视频

    jQuery Face Detection 是一款人脸检测插件,能够检测到图片,视频和画布中的人脸坐标.它跟踪人脸并输出人脸模型的坐标位置为一个数组.我们相信,面部识别技术能够给我们的 Web 应用带 ...

  4. 主成分分析 (PCA) 与其高维度下python实现(简单人脸识别)

    Introduction 主成分分析(Principal Components Analysis)是一种对特征进行降维的方法.由于观测指标间存在相关性,将导致信息的重叠与低效,我们倾向于用少量的.尽可 ...

  5. 【Win10 应用开发】人脸识别

    可能你会认为人脸识别用起来会很复杂,老周当初也这么想,但通过实际操作后,我发现非然. 经过微软封装的东西,向来都是复杂问题简单化,只要用得舒心,代码越少越好,用最少的代码做最多的事情,此为大师境界也. ...

  6. 关于opencv中人脸识别主函数的部分注释详解。

    近段时间在搞opencv的视频人脸识别,无奈自带的分类器的准确度,实在是不怎么样,但又能怎样呢?自己又研究不清楚各大类检测算法. 正所谓,功能是由函数完成的,于是自己便看cvHaarDetectObj ...

  7. Opencv摄像头实时人脸识别

    Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...

  8. paper 129 : 比较好的开源人脸识别软件

    1.face.com 以色列公司,某年六月时被Facebook收购,同时暂停了API服务,之前测试过他们的服务,基本上是了解到的应用中做得最牛的了. 2.orbe Orbeus由麻省理工学院和波士顿大 ...

  9. 【《zw版·Halcon与delphi系列原创教程》 zw_halcon人脸识别

    [<zw版·Halcon与delphi系列原创教程>zw_halcon人脸识别 经常有用户问,halcon人脸识别方面的问题. 可能是cv在人脸识别.车牌识别方面的投入太多了. 其实,人脸 ...

随机推荐

  1. OpenGL 顶点缓存对象

    顶点缓存对象(Vertex Buffer Object,简称 VBO),允许开发者根据情况把顶点数据放到显存中. 如果不用 VBO,用 glVertexPointer / glNormalPointe ...

  2. Java [Leetcode 278]First Bad Version

    题目描述: You are a product manager and currently leading a team to develop a new product. Unfortunately ...

  3. 最简单的视音频播放示例2:GDI播放YUV, RGB

    前一篇文章对“Simplest Media Play”工程作了概括性介绍.后续几篇文章打算详细介绍每个子工程中的几种技术.在记录Direct3D,OpenGL这两种相对复杂的技术之前,打算先记录一种和 ...

  4. .NET之美——1.1 C#中的泛型

    1.1 C#中的泛型 .Net 1.1版本最受诟病的一个缺陷就是没有提供对泛型的支持.通过使用泛型,我们可以极大地提高代码的重用度,同时还可以获得强类型的支持,避免了隐式的装箱.拆箱,在一定程度上提升 ...

  5. Nginx源码安装及调优配置

    导读 由于Nginx本身的一些优点,轻量,开源,易用,越来越多的公司使用nginx作为自己公司的web应用服务器,本文详细介绍nginx源码安装的同时并对nginx进行优化配置. Nginx编译前的优 ...

  6. Android WebView常见问题的解决方案总结----例如Web page not available

    之前android虚拟机一直都可以直接联网,今天写了一个WebView之后,突然报出了Web page not available的错误,但是查看虚拟机自带的浏览器,是可以上网的,所以检查还是代码的问 ...

  7. CodeForces 558E(计数排序+线段树优化)

    题意:一个长度为n的字符串(只包含26个小字母)有q次操作 对于每次操作 给一个区间 和k k为1把该区间的字符不降序排序 k为0把该区间的字符不升序排序 求q次操作后所得字符串 思路: 该题数据规模 ...

  8. codeforces 687B - Remainders Game 数学相关(互质中国剩余定理)

    题意:给你x%ci=bi(x未知),是否能确定x%k的值(k已知) ——数学相关知识: 首先:我们知道一些事情,对于k,假设有ci%k==0,那么一定能确定x%k的值,比如k=5和ci=20,知道x% ...

  9. IOS 给图片添加水印 打印文字

    1.加文字   -(UIImage *)addText:(UIImage *)img text:(NSString *)text1  {           //get image width and ...

  10. 【LeetCode 215】Kth Largest Element in an Array

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...