一.代码声明

下面的代码是博主参考了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. 通过对源代码的反向工程学习CoreData架构

    在本文开始,先给出反向工程后的结果: 不过需要注意,三个实例的指针都被同一个实例拥有,比如三个指针都位于appDelegate. 在AppDelegate类中定义了下面三个属性: @property ...

  2. GitHub开源库排名一百的简单介绍,值得收藏!

    GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub ...

  3. C# 邮件发送系统

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. Android之布局属性

    1) 布局的相关属性 ① android:layout_weight="1.0",layout_weight 用于给一个线性布局中的诸多视图重要度赋值.所有的视图都有一个layou ...

  5. 【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 ...

  6. JDBC第一天连接池案例

    JDBC,JDBC的工具类JDBC 连接从连接池中拿: 创建连接池的语句: package day01; import java.sql.Connection; import java.sql.Dri ...

  7. 多校5 HDU5787 K-wolf Number 数位DP

    // 多校5 HDU5787 K-wolf Number 数位DP // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d // f 用作标记,当现在枚举的数小 ...

  8. 自定义Camera综述(一般步骤、注意事项、遇到的难题<【内存溢出问题】>、像素参考)

    一般步骤: 1. 检查和访问Camera:创建代码来检查Camera和所申请访问的存在性: 2. 创建一个预览类:继承SurfaceView来创建一个Camera的预览类,并实现SurfaceHold ...

  9. 内核源码分析之进程调度机制(基于3.16-rc4)

    进程调度所使用到的数据结构: 1.就绪队列 内核为每一个cpu创建一个进程就绪队列,该队列上的进程均由该cpu执行,代码如下(kernel/sched/core.c). DEFINE_PER_CPU_ ...

  10. 【转】linux shell 正则表达式(BREs,EREs,PREs)差异比较

    我想各位也和我一样,再linux下使用grep,egrep, awk , sed, vi的搜索时,会经常搞不太清楚,哪此特殊字符得使用转义字符'\' ..   哪些不需要, grep与egrep的差异 ...