热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

libfacedetetion人脸检测(留给自己看的)

基于摄像头libfacedec.cpp:定义控制台应用程序的入口点。#includestdafx.h#includestdafx.h#include<o

基于摄像头

// libfacedec.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdafx.h"
#include //加载OPENCV库所需的头文件
#include //加载libfacedetection库所需的头文件
#include
#include
#include
#include


using namespace std;
using namespace cv;

//提示音文件库
#pragma comment(lib, "winmm.lib")
//定义一个缓冲区,大小为:0x20000
#define DETECT_BUFFER_SIZE 0x20000

int _tmain(int argc, _TCHAR* argv[])
{
Mat src;
int scale = 2;
int * pResults = NULL;
// 向系统申请分配指定size个字节的内存空间
unsigned char * pBuffer = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
if (!pBuffer)
{
fprintf(stderr, "Can not alloc buffer.\n");
return -1;
}
VideoCapture cap(0);//加载USB摄像头
if (!cap.isOpened())
{
cout <<"Please check your USB camera's interface num." < return -1;
}
while (true)
{
cap >> src;
resize(src, src, Size(src.cols / scale, src.rows / scale), 1);
time_t t = time(0);
/*char tmp[64];
strftime(tmp, sizeof(tmp), "%Y/%m/%d %X %A", localtime(&t));
Point pt(20, 25);
Scalar color = CV_RGB(0, 255, 255);
putText(src, tmp, pt, CV_FONT_HERSHEY_DUPLEX, 0.5f, color);*/
double t1 = 0;
t1 = (double)cvGetTickCount();//用来计算算法执行时间
if (!src.empty())
{

Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);//图像灰度处理
//加载人脸检测库(libfacedetection),用来检测人脸。参数说明:pBuffer:用于存储人脸检测结果的缓冲存储器,大小为0x20000字节!gray.ptr(0):
//输入图像必须是单通道的灰度图像gray.cols:灰度图像的列。gray.rows:灰度图像的行。gray.step:灰度图像的深度。
if (1)
{
pResults = facedetect_multiview_reinforce(pBuffer, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step, 1.2f, 2, 48, 0, 1);
//pResults = facedetect_multiview(pBuffer, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step, 1.2f, 2, 48, 0, 1);
//加载人脸检测库(libfacedetection)后,会通过68个点来描述人脸面部特征,还可以得到人脸框的信息Rect(p[0], p[1],p[2], p[3])左上角坐标
//:(p[0],p[1])、宽度:p[2]、高度:p3、邻近成员:p[4]、人脸偏转角度:p[5],这些数据都会对后面的检测有帮助。
for (int i = 0; i <(pResults ? *pResults : 0); i++)
{
short * p = ((short*)(pResults + 1)) + 142 * i;
//绘制人脸检测框
//rectangle( src, Rect(p[0], p[1],p[2], p[3]), Scalar(0, 255, 0), 2 );
// 绘制人脸特征点68个
for (int j = 0; j <68; j++)
{
circle( src, Point((int)p[6 + 2 * j], (int)p[6 + 2 * j + 1]), 1, Scalar(0, 0, 255), 2 );
}

}
}
resize(src, src, Size(src.cols*scale, src.rows*scale), 1);
imshow("测试视频", src);
waitKey(1);
}
t1 = (double)cvGetTickCount() - t1;//相减为算法执行的时间
printf("detection time = %g ms\n", t1 / ((double)cvGetTickFrequency()*1000.));

if (waitKey(1) == 27) //wait for 'esc' key press for 10 ms. If 'esc' key is pressed, break loop
{
cout <<"video paused!, press q to quit, any other key to continue" < if (waitKey(0) == 'q')
{
cout <<"terminated by user" < break;
}
}
}

return 0;
}

基于图片的

// libfacedec.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdafx.h"
#include //加载OPENCV库所需的头文件
#include //加载libfacedetection库所需的头文件
#include
#include
#include
#include


using namespace std;
using namespace cv;

//提示音文件库
#pragma comment(lib, "winmm.lib")
//定义一个缓冲区,大小为:0x20000
#define DETECT_BUFFER_SIZE 0x20000

int _tmain(int argc, _TCHAR* argv[])
{

int scale = 2;
int * pResults = NULL;
// 向系统申请分配指定size个字节的内存空间
unsigned char * pBuffer = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
if (!pBuffer)
{
fprintf(stderr, "Can not alloc buffer.\n");
return -1;
}
//VideoCapture cap(0);//加载USB摄像头
/*if (!cap.isOpened())
{
cout <<"Please check your USB camera's interface num." < return -1;
}*/

Mat src = imread("D://vvoo//14.jpg");
//cap >> src;
//resize(src, src, Size(src.cols / scale, src.rows / scale), 1);
time_t t = time(0);
/*char tmp[64];
strftime(tmp, sizeof(tmp), "%Y/%m/%d %X %A", localtime(&t));
Point pt(20, 25);
Scalar color = CV_RGB(0, 255, 255);
putText(src, tmp, pt, CV_FONT_HERSHEY_DUPLEX, 0.5f, color);*/
if (!src.empty())
{

Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);//图像灰度处理
//加载人脸检测库(libfacedetection),用来检测人脸。参数说明:pBuffer:用于存储人脸检测结果的缓冲存储器,大小为0x20000字节!gray.ptr(0):
//输入图像必须是单通道的灰度图像gray.cols:灰度图像的列。gray.rows:灰度图像的行。gray.step:灰度图像的深度。
if (1)
{
pResults = facedetect_multiview_reinforce(pBuffer, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step, 1.2f, 2, 48, 0, 1);
//pResults = facedetect_multiview(pBuffer, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step, 1.2f, 2, 48, 0, 1);
//加载人脸检测库(libfacedetection)后,会通过68个点来描述人脸面部特征,还可以得到人脸框的信息Rect(p[0], p[1],p[2], p[3])左上角坐标
//:(p[0],p[1])、宽度:p[2]、高度:p3、邻近成员:p[4]、人脸偏转角度:p[5],这些数据都会对后面的检测有帮助。
for (int i = 0; i <(pResults ? *pResults : 0); i++)
{
short * p = ((short*)(pResults + 1)) + 142 * i;
//绘制人脸检测框
//rectangle( src, Rect(p[0], p[1],p[2], p[3]), Scalar(0, 255, 0), 2 );
// 绘制人脸特征点68个
for (int j = 0; j <68; j++)
{
circle(src, Point((int)p[6 + 2 * j], (int)p[6 + 2 * j + 1]), 1, Scalar(0, 0, 255), 2);
}

}
}
resize(src, src, Size(src.cols*scale, src.rows*scale), 1);
imshow("测试视频", src);
imwrite("D://vvoo//122.jpg", src);
waitKey(0);

}

return 0;
}



推荐阅读
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
author-avatar
vegg巛iegbaby
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有