一.代码声明

下面的代码是博主参考了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. MYSQL设计方案

    Scale Out:横向扩展,增加处理节点提高整体处理能力Scale Up:纵向扩展,通过提升单个节点的处理能力达到提升整体处理能力的目的 ReplicationMySQL的replication是异 ...

  2. Android 长按setOnItemLongClickListener 注意细节

    Java代码 gridview.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean ...

  3. 正在连接...ORA-12541: TNS: 无监听程序

    明明已经在Net Configuration Assistant中配置过监听程序并启动过.但在测试本地网络服务名配置中扔提示以上错误"正在连接...ORA-12541: TNS: 无监听程序 ...

  4. [转] C# 泛型类型参数的约束

    啊.紫原文C# 泛型类型参数的约束 在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制.如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误.这些限制 ...

  5. 有效处理java异常的三个原则

    Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮.易于调试.异常之所以是一种强大的调试手段,在于其回答了以下三个问题: 什么出了错? 在哪出的错? 为什么出错? ...

  6. 【LeetCode 230】Kth Smallest Element in a BST

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...

  7. sizeof和strlen小结

    sizeof和strlen小结 写在前面 之所以要总结一下sizeof和strlen的用法和区别,是因为这些知识可以帮助我们更加深入的理解各种数据结构在内存中的占用情况,也许表面上看好像没有多大用处, ...

  8. html 5 canvas 绘制太极demo

    一个练习canvas的小案例.其中若有小问题,欢迎大神拍砖……^_* 代码效果预览地址:http://code.w3ctech.com/detail/2500. <div class=" ...

  9. iOS Development Learning 13Nov

    关注了关东升老师在博客园的iOS开发博客. 在使用能力课堂观看智捷课堂的iOS8开发视频教程.观看到Part1 课时3 Xcode中的iOS工程模板

  10. VB调用自持字体

    VB调用自制字体我这里有一个C#的例子,请问如何在VB中实现啊. 我们写exe程序时,默认字体是宋体,比较难看,指定了其他字体,但是其他用户上没有你指定的这个字体的话,也会变成默认的宋体.解决的办法有 ...