一.代码声明

下面的代码是博主参考了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. javascript OOP编辑思想的一个实践参考

    <html> <style type="text/css"> .current { background-color: red; } .dv { backg ...

  2. 一个P2P点播直播开源项目:P2PCenter

    最近跟着公司的项目走,我也研究了不少东西,尤其是在P2P方面,广泛涉猎各种开源项目,尤其是国外的开源项目,意外的发现了一个国内的项目,做的还不错,推荐一下.---------------------使 ...

  3. 流媒体相关知识介绍 及其 RTP 应用

    一.流媒体简介 随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡.目前在网络上传输音频/视频(Audio/Video,简称A/V)等多媒 ...

  4. Discuz!NT静态文件缓存(SQUID)

    在目前最新版本的产品中,我们提供了缓存静态文件的解决方案,就是使用SQUID做静态前端,将论坛中的大部分静态文件布署或外链到一个新的HTTP链接上,其中可以外链的静态文件包括:      1.Disc ...

  5. 鼠标悬停css3动画效果

    下载Demo 效果预览 html: <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  6. 你所不知道的 URL

    0.说明 第一幕 产品:大叔有用户反映账户不能绑定公众号.大叔:啊咧咧?怎么可能,我看看?大叔:恩?这也没问题啊,魏虾米.大叔:还是没问题啊,挖叉类.大叔:T T,话说产品姐姐是不是Java提供接口的 ...

  7. .NET之美——C#中的委托和事件(续)

    C#中的委托和事件(续) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为 ...

  8. POJ 2421 Constructing Roads

    题意:要在n个城市之间建造公路,使城市之间能互相联通,告诉每个城市之间建公路的费用,和已经建好的公路,求最小费用. 解法:最小生成树.先把已经建好的边加进去再跑kruskal或者prim什么的. 代码 ...

  9. 转载: Vim 练级攻略

    转自:http://coolshell.cn/articles/5426.html  酷壳 vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类, ...

  10. HDU 1892-See you(二维BIT)

    题意: 最多1000*1000的方格,各方格开始有一本书 有四种操作:对指定方格把书拿走或向里面放书,从一个方格那一定量的书放到另一个方格,查询给定对角线顶点的坐标的矩形范围内包含的书的总数 分析: ...