- Mastering OpenCV 3(Second Edition)
- Daniel Lélis Baggio Shervin Emami David Millán Escrivá Khvedchenia Ievgen Jason Saragih Roy Shilkrot
- 554字
- 2021-07-02 23:29:09
Showing the user where to put their face
When the alien mode is first started, we will draw the face outline on top of the camera frame so the user knows where to put their face. We will draw a big ellipse covering 70% of the image height, with a fixed aspect ratio of 0.72, so that the face will not become too skinny or fat depending on the aspect ratio of the camera:
// Draw the color face onto a black background. Mat faceOutline = Mat::zeros(size, CV_8UC3); Scalar color = CV_RGB(255,255,0); // Yellow. int thickness = 4; // Use 70% of the screen height as the face height. int sw = size.width; int sh = size.height; int faceH = sh/2 * 70/100; // "faceH" is radius of the ellipse. // Scale the width to be the same nice shape for any screen width. int faceW = faceH * 72/100; // Draw the face outline. ellipse(faceOutline, Point(sw/2, sh/2), Size(faceW, faceH), 0, 0, 360, color, thickness, CV_AA);
To make it more obvious that it is a face, let's also draw two eye outlines. Rather than drawing an eye as an ellipse, we can give it a bit more realism (see the following figure) by drawing a truncated ellipse for the top of the eye and a truncated ellipse for the bottom of the eye, because we can specify the start and end angles when drawing with the ellipse() function:
// Draw the eye outlines, as 2 arcs per eye. int eyeW = faceW * 23/100; int eyeH = faceH * 11/100; int eyeX = faceW * 48/100; int eyeY = faceH * 13/100; Size eyeSize = Size(eyeW, eyeH); // Set the angle and shift for the eye half ellipses. int eyeA = 15; // angle in degrees. int eyeYshift = 11; // Draw the top of the right eye. ellipse(faceOutline, Point(sw/2 - eyeX, sh/2 -eyeY), eyeSize, 0, 180+eyeA, 360-eyeA, color, thickness, CV_AA); // Draw the bottom of the right eye. ellipse(faceOutline, Point(sw/2 - eyeX, sh/2 - eyeY-eyeYshift), eyeSize, 0, 0+eyeA, 180-eyeA, color, thickness, CV_AA); // Draw the top of the left eye. ellipse(faceOutline, Point(sw/2 + eyeX, sh/2 - eyeY), eyeSize, 0, 180+eyeA, 360-eyeA, color, thickness, CV_AA); // Draw the bottom of the left eye. ellipse(faceOutline, Point(sw/2 + eyeX, sh/2 - eyeY-eyeYshift), eyeSize, 0, 0+eyeA, 180-eyeA, color, thickness, CV_AA);
We can do the same to draw the bottom lip of the mouth:
// Draw the bottom lip of the mouth. int mouthY = faceH * 48/100; int mouthW = faceW * 45/100; int mouthH = faceH * 6/100; ellipse(faceOutline, Point(sw/2, sh/2 + mouthY), Size(mouthW, mouthH), 0, 0, 180, color, thickness, CV_AA);
To make it even more obvious that the user should put their face where shown, let's write a message on the screen!
// Draw anti-aliased text. int fontFace = FONT_HERSHEY_COMPLEX; float fontScale = 1.0f; int fontThickness = 2; char *szMsg = "Put your face here"; putText(faceOutline, szMsg, Point(sw * 23/100, sh * 10/100), fontFace, fontScale, color, fontThickness, CV_AA);
Now that we have the face outline drawn, we can overlay it onto the displayed image by using alpha blending, to combine the cartoonified image with this drawn outline:
addWeighted(dst, 1.0, faceOutline, 0.7, 0, dst, CV_8UC3);
This results in the outline in the following figure, showing the user where to put their face, so we don't have to detect the face location:

- 軟件安全技術
- Java Web應用開發技術與案例教程(第2版)
- Python數據分析(第2版)
- Python 3破冰人工智能:從入門到實戰
- 青少年信息學競賽
- Python項目實戰從入門到精通
- Mastering Elasticsearch(Second Edition)
- ExtJS Web應用程序開發指南第2版
- 從程序員角度學習數據庫技術(藍橋杯軟件大賽培訓教材-Java方向)
- jQuery for Designers Beginner's Guide Second Edition
- Moodle 3 Administration(Third Edition)
- Android系統下Java編程詳解
- JavaWeb從入門到精通(視頻實戰版)
- Pandas 1.x Cookbook
- Java程序性能優化實戰