dlib人脸特征点对齐

前面我们介绍了使用dlib进行人脸检测,下面我们给出如何使用dlib进行人脸特征点检测。我们直接贴出代码。我们的代码包括如下几部分功能:

  • 检测单张图片
  • 检测一个视频
  • 检测一个camera
    先给出代码:

#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing/render_face_detections.h>
#include <dlib/image_processing.h>
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include <iostream>
#include <string> 
#include <dlib/opencv.h>
#include <opencv2/highgui/highgui.hpp>using namespace dlib;
using namespace std;// ----------------------------------------------------------------------------------------
void PrintHelp();
int FaceDetectionAndAlignment(const char* inputname);int main(int argc, char** argv)
{try{// This example takes in a shape model file and then a list of images to// process.  We will take these filenames in as command line arguments.// Dlib comes with example images in the examples/faces folder so give// those as arguments to this program.if (argc == 1){PrintHelp();return 0;}if (strcmp(argv[1],"Demo")==0){if (2==argc){return FaceDetectionAndAlignment("");}else if (3==argc){return FaceDetectionAndAlignment(argv[2]);}}else{PrintHelp();return 0;}}catch (exception& e){cout << "\nexception thrown!" << endl;cout << e.what() << endl;}
}// ----------------------------------------------------------------------------------------
void PrintHelp()
{cout << "Useage:" << endl;cout << "1. test model via a camera: face_alignment.exe  Demo " << endl;cout << "2. test model on a pic:     face_alignment.exe  Demo xx.jpg" << endl;  cout << "3. test model on a video:   face_alignment.exe  Demo xx.avi" << endl;cout << endl;
}
int FaceDetectionAndAlignment(const char* inputname)
{string inputName;CvCapture* capture = 0; cv::Mat frame, frameCopy, image;image_window win;frontal_face_detector detector = get_frontal_face_detector();shape_predictor pose_model;deserialize("D:/dlib/model/shape_predictor_68_face_landmarks.dat") >> pose_model;if (inputname != NULL){inputName.assign(inputname);}// name is empty or a numberif (inputName.empty()){capture = cvCaptureFromCAM(0);if (!capture){cout << "Capture from camera didn't work" << endl;return -1;}}// name is not emptyelse if (inputName.size()){if (inputName.find(".jpg") != string::npos || inputName.find(".png") != string::npos|| inputName.find(".bmp") != string::npos){image = cv::imread(inputName, 1);if (image.empty()){cout << "Read Image fail" << endl;return -1;}}else if (inputName.find(".mp4") != string::npos || inputName.find(".avi") != string::npos|| inputName.find(".wmv") != string::npos){capture = cvCaptureFromAVI(inputName.c_str());if (!capture){cout << "Capture from AVI didn't work" << endl;return -1;}}}// -- 2. Read the video streamif (capture!=nullptr){cout << "In capture ..." << endl;// Grab and process frames until the main window is closed by the user.while (!win.is_closed()){// Grab a frameIplImage* iplImg = cvQueryFrame(capture);iplImg = cvQueryFrame(capture);frame = cv::cvarrToMat(iplImg);if (frame.empty())break;if (iplImg->origin == IPL_ORIGIN_TL) //frame.copyTo(frameCopy);elsecv::flip(frame, frameCopy, 0);// Turn OpenCV's Mat into something dlib can deal with.  Note that this just// wraps the Mat object, it doesn't copy anything.  So cimg is only valid as// long as temp is valid.  Also don't do anything to temp that would cause it// to reallocate the memory which stores the image as that will make cimg// contain dangling pointers.  This basically means you shouldn't modify temp// while using cimg.cv_image<bgr_pixel> cimg(frameCopy);// Detect faces std::vector<rectangle> faces = detector(cimg);// Find the pose of each face.std::vector<full_object_detection> shapes;for (unsigned long i = 0; i < faces.size(); ++i)shapes.push_back(pose_model(cimg, faces[i]));// Display it all on the screenwin.clear_overlay();win.set_image(cimg);win.add_overlay(render_face_detections(shapes));if (cv::waitKey(10) >= 0)goto _cleanup_;}cv::waitKey(0);_cleanup_:cvReleaseCapture(&capture);}else{if (!image.empty()){cout << "In image read" << endl;cv_image<bgr_pixel> cimg(image);// Detect faces std::vector<rectangle> faces = detector(cimg);// Find the pose of each face.std::vector<full_object_detection> shapes;for (unsigned long i = 0; i < faces.size(); ++i)shapes.push_back(pose_model(cimg, faces[i]));// Display it all on the screenwin.clear_overlay();win.set_image(cimg);win.add_overlay(render_face_detections(shapes));cout << "Hit enter to exit..." << endl;cin.get();}}return 0;}

再逐一介绍。

检测单张图片

右击项目,选择属性,调试填写:

Demo  E:\\datasets\\helen\\testset\\30427236_1.jpg

如下图:

实验结果:

相当不错的效果了。

检测视频

右击项目,选择属性,调试填写:

Demo  E:\\datasets\\vid.wmv


效果视频地址:
http://7xtmgn.com1.z0.glb.clouddn.com/dlibvideo.mp4

检测camera

右击项目,选择属性,调试填写:

Demo 

效果视频地址:
http://7xtmgn.com1.z0.glb.clouddn.com/dlibcamera.mp4

完整源代码:dlib face_alignment

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《LoadRunner 12七天速成宝典》—第2章2.6节第二个性能测试案例

本节书摘来自异步社区《LoadRunner 12七天速成宝典》一书中的第2章&#xff0c;第2.6节第二个性能测试案例&#xff0c;作者陈霁&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.6 第二个性能测试案例云云&#xff1a;烤鱼吃得很爽。 恋恋&#xff1a;就…

MongoDB_1

突然想去看下MongoDB的东西&#xff0c;于是有了这篇文章。其实很早以前就看过一些关于NoSql的文章&#xff0c;还记得当时里面有介绍MongoDB的&#xff0c;多瞅了2眼&#xff0c;并且在Window下安装了MongoDB的驱动&#xff0c;小玩了会。今天重新翻出来&#xff0c;没成想在命…

pyqt5从子目录加载qrc文件_实战PyQt5: 045-添加资源文件

添加资源文件在使用PyQt进行图形界面开发的时候不免要用到一些外部资源&#xff0c;比如图片&#xff0c;qss配置文件等。在前面代码中&#xff0c;遇到这类问题&#xff0c;我们使用绝对路径的方式来解决&#xff0c;这种方式&#xff0c;本身有其不方便之处(比如&#xff0c;…

西门子ddc_铁门关西门子两通电动阀VVF42.25-10C+SKD60西

铁门关西门子两通电动阀西SIEMENS/西门子电动温控阀、控制箱、电动蝶阀、电动球阀、超声波热量表、超声波流量计、电磁流量计阀体灰口铸铁 EN-GJL-2502.霍尼韦尔主营&#xff1a;楼宇资料系统、热网自控系统、风机盘管电动两通阀、空气压差开关、水流开关、电动执行器、风阀执行…

JS-键盘事件之方向键移动元素

注意三点&#xff1a; 1&#xff1a;事件名称onkeydown。 2&#xff1a;事件加给document&#xff0c;而非window。 3&#xff1a; 把元素的top&#xff0c;left值分别用offsetTop&#xff0c;offsetLeft来设定。 <!DOCTYPE html> <html><head><meta char…

Swift学习字符串、数组、字典

一.字符串的使用 let wiseWords "\"I am a handsome\"-boy" var emptyString "" if emptyString.isEmpty{ println("这是一个空值") }简单说明&#xff1a;isEmpty方法是用来判断字符串是否为空值的&#xff0c;之后会执行if语句中的…

python对excel操作简书_Python读写Excel表格,就是这么简单粗暴又好用

最近在做一些数据处理和计算的工作&#xff0c;因为数据是以.CSV格式保存的&#xff0c;因此刚开始直接用Excel来处理。 但是做着做着发现重复的劳动&#xff0c;其实并没有多大的意义&#xff0c;于是就想着写个小工具帮着处理。 以前正好在一本书上看到过&#xff0c;使用Pyt…

halcon/c++接口基础 之 halcon初认识

从今天开始&#xff0c;开始更新博客&#xff0c;主要分享自己最近正在翻译的Halcon/C教程。先给出第一篇文章&#xff0c;由于此文章&#xff0c;是用latex写的&#xff0c;直接导成html&#xff0c;保存在七牛云存储上&#xff0c;所以直接点击链接就看到&#xff0c;后面我将…

指数型组织形成的 9 大驱动因素

指数时代&#xff0c;是一个前所未有的激动人心的世界。 Airbnb, 谷歌, 亚马逊和GitHub这些知名的公司&#xff0c;都有一个让人称羡的共同点&#xff0c;那就是——他们都是非常成功的指数型组织&#xff08;Exponential Organizations&#xff0c;ExO’s&#xff09;。 “在当…

mysqld:表mysql.plugin不存在_99%测试工程师不知道的数据库知识|干货

点击上方“蓝字”关注我们数据库&#xff0c;简而言之可视为电子化的文件柜——存储电子文件的处所&#xff0c;用户可以对文件中的数据进行新增、查询、更新、删除等操作。所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立…

Windows Phone 执行模型概述

Windows Phone 执行模型控制在 Windows Phone 上运行的应用程序的生命周期&#xff0c;该过程从启动应用程序开始&#xff0c;直至应用程序终止。 该执行模型旨在始终为最终用户提供快速响应的体验。为此&#xff0c;在任何给定时间内&#xff0c;Windows Phone 仅允许一个应用…

halcon/c++接口基础 之 构造函数与Halcon算子

Halcon/C提供了构造函数&#xff0c;主要基于适合的Halcon算子。比如说HImage和HBarCode基于read_image and create_bar_code_model。 请注意当前的Halcon版本针对不同的算子构造函数的功能不同。如下我们介绍了一些最常用的Halcon算子&#xff0c;而一个完整的构造函数列表可…

bat自动输入用户名和密码_「小白到大牛之路6」交换机后台管理之重复输入用户名和密码...

项目需求解决项目5中存在的问题&#xff1a;用户名和密码只能输入一次。如果输入错误&#xff0c;就没有机会重新输入。项目实现#include int main(void) {// 定义变量&#xff0c;用来表示用户名和密码char name[32];char password[16];//输入用户名和密码while (1) {// 输入用…

halcon/c++接口基础 之 析构函数和Halcon算子

所有的HALCON/C类都提供了默认的析构函数用来自动销毁对应的内存。对于某些类&#xff0c;析构函数基于适合的算子&#xff1a; Windows: HWindow类的析构函数基于close_window关闭窗口。注意&#xff1a;算子本身不是析构器。你可以选择调用CloseWindow关闭窗口&#xff0c;…

ios 上传图片到阿里云的oss_JEECG BOOT 上传如何同时支持阿里OSS、Minio、本地存储

Jeecg-Boot 提供了文件及图片上传功能&#xff0c;前两个文件已介绍了MinIO和OSS配置&#xff0c;现在可根据需要选择上传方式。文件上传接口(图片/文件)在yml文件中可切换图片/文件存储方式访问路径上送参数说明在yml文件中可切换图片/文件存储方式local为本地存储minio为使用…

halcon/c++接口基础 之内存管理

所有的HALCON类&#xff0c;不仅仅HImage,HRegion,HTuple&#xff0c;HFramegrabber等等&#xff0c;还有面向过程的方法中使用的Hobject&#xff0c;都可以使用默认的析构器自动释放内存。 &#xff08; see also section 2.4 “Destructors and Halcon Operators”)&#xf…

python时间格式_python 格式化日期

常用的时间函数如下 获取当前日期&#xff1a;time.time() 获取元组形式的时间戳&#xff1a;time.local(time.time()) 格式化日期的函数(基于元组的形式进行格式化)&#xff1a; &#xff08;1&#xff09;time.asctime(time.local(time.time())) &#xff08;2&#xff09;ti…

halcon/c++接口基础 之异常处理

关于运行错误&#xff0c;HALCON/C默认打印错误信息并且终止程序。然而在某些应用中&#xff0c;放宽这个法则可能更有用。比如&#xff0c;如果一个应用要求用户交互式地指定一个图像文件读取&#xff0c;如果因为用户不能拼错文件名而终止程序的话&#xff0c;会很不方便。因…

SVN学习(二)——SVN 提交、更新、解决冲突等操作步骤

1. 纳入版本控制 ①新建文件abc.txt ②在文件上点右键 ③添加后文件图标发生变化 2. 提交 ①使用TortoiseSVN可以提交具体某一个文件&#xff0c;或某一个目录下的所有改变。方法就是在想要提交的项目下点右键&#xff0c;然后SVN Commit...&#xff0c;就可以看到如下界面 ②日…

dat文件打开乱码_5.2 实战1:解决在Linux下打开Windows汉字文本的乱码问题

今天MK继续来分享linux的学习文章&#xff0c;今天讲的主要是实战部分。1&#xff0e;实验环境&#xff1a;CentOS 7.5 现在系统默认使用的语言是汉语。&#xff08;系统中必须安装好中文包&#xff09;。2&#xff0e;在windows系统上编辑名字为“a此文件在windows下打开正常-…