Putting a mask on face using OpenCV

This is a example to put a mask on your face. This is a fun application that is meant to be used for entertainment purpose. You might have seen such apps in google hangouts.

Steps:
  1. Detect face from the input video frame
  2. Load the mask and make the white region of the mask transparent.
  3. Put the mask at the face position
  4. Display the image
Any mask can be used for this purpose. I have downloaded some masks from internet which you can download here.

Download masks

Put the mask images in a folder with folder name "masks" inside the project folder.

For achieving higher speed, the parameter are adjusted according to this.

Code:

------------
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

double min_face_size=20;
double max_face_size=200;
Mat mask;

Mat detectFace(Mat src);
Mat putMask(Mat src,Point center,Size face_size);

int main( )
{
    VideoCapture cap(0);
    namedWindow( "window1", 1 );   
    mask = imread("masks/5.jpg");

    while(1)
    {
        Mat frame;
        cap >> frame;         
        frame=detectFace(frame);
        
        imshow( "window1", frame );
        // Press 'c' to escape
        if(waitKey(1) == 'c') break;        
    }

    waitKey(0);                  
    return 0;
}

Mat detectFace(Mat image)
{
    // Load Face cascade (.xml file)
    CascadeClassifier face_cascade( "C:/OpenCV243/data/Haarcascades/haarcascade_frontalface_alt2.xml" );

    // Detect faces
    std::vector<Rect> faces;

    face_cascade.detectMultiScale( image, faces, 1.2, 2, 0|CV_HAAR_SCALE_IMAGE, Size(min_face_size, min_face_size),Size(max_face_size, max_face_size) );
    
    // Draw circles on the detected faces
    for( int i = 0; i < faces.size(); i++ )
    {   // Lets only track the first face, i.e. face[0] 
        min_face_size = faces[0].width*0.7;
        max_face_size = faces[0].width*1.5;
        Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );        
        image=putMask(image,center,Size( faces[i].width, faces[i].height));
    }    
    return image;
}

Mat putMask(Mat src,Point center,Size face_size)
{
    Mat mask1,src1;
    resize(mask,mask1,face_size);    

    // ROI selection
     Rect roi(center.x - face_size.width/2, center.y - face_size.width/2, face_size.width, face_size.width);
    src(roi).copyTo(src1);

    // to make the white region transparent
    Mat mask2,m,m1;
    cvtColor(mask1,mask2,CV_BGR2GRAY);
    threshold(mask2,mask2,230,255,CV_THRESH_BINARY_INV); 

    vector<Mat> maskChannels(3),result_mask(3);
    split(mask1, maskChannels);
    bitwise_and(maskChannels[0],mask2,result_mask[0]);
    bitwise_and(maskChannels[1],mask2,result_mask[1]);
    bitwise_and(maskChannels[2],mask2,result_mask[2]);
    merge(result_mask,m );         //    imshow("m",m);

    mask2 = 255 - mask2;
    vector<Mat> srcChannels(3);
    split(src1, srcChannels);
    bitwise_and(srcChannels[0],mask2,result_mask[0]);
    bitwise_and(srcChannels[1],mask2,result_mask[1]);
    bitwise_and(srcChannels[2],mask2,result_mask[2]);
    merge(result_mask,m1 );        //    imshow("m1",m1);

    addWeighted(m,1,m1,1,0,m1);    //    imshow("m2",m1);
    
    m1.copyTo(src(roi));

    return src;
}
------------

Result:


7 comments:

  1. Thanks for good job. It is better if we consider the angle of face. And then the mask will roate with correspoding angle

    ReplyDelete

  2. الكثير منا يريد الانتقال من مكان الى مكان اخر اوسع او افخم او اقيم ولكن تظل الحسابات والمصاريف وعمليات النقل تؤثر على قرار الانتقال نظرا للمصاريف الباهظه ونظرا لعدم التفرغ للفك والتركيب والتغليف وهكذا ولكن اذا كنت تفكر فى الانتقال لاى سبب ولم تأخد القرار بسبب الاسباب المذكوره فلا تفكر كثيرا ولا تحتار مع شركتنا شركة نقل عفش بالدمام هو القرار السليم فى ايجاد شركة تقوم بعمليه النقل بمنتهى السرعه والدقه فى الاداء لكى تحافظ على الاثاث والمنقولات من اى تكسير او خدوش او اى اثار سلبيه مع تحقيق اقل تكاليف ممكنه كل ما عليك هو الاتصال بنا شركة نقل اثاث بالدمام لكى تتعرف على خدماتنا الغير محدوده فى عمليات النقل فنحن نقوم بكافة مراحل النقل من فك وتغليف وتعبئه ونقل وتركيب العفش والاثاث وكافة المنقولات من انتيك وملابس ومفروشات وادوات مطبخ وكل ما يلزم لعميله نقل امنه ومن اجل ان تحافظ على منقولاتك حتى لو كان اثاث مكتبك او شركتك او فندقك مثلا فيكون الاثاث والمفروشات جديد وتريد الحفاظ عليه كل هذا سوف تجده معنا واكثر نحن شركة تخزين اثاث بالدمام وكل هذا يتم فى سرعه بالغه لضمان عدم التاخير عن المواعيد الخاصه بك او تعطيلك عن اعمالك ايا كانت درجه اهميتها فنحن نتواجد من اجل خدمتك وراحتك وتحقيق كل احلامك .
    لمزيد من خدماتنا
    شركة نقل اثاث بالخبر
    شركة نقل عفش بالخبر
    للتواصل
    0537772829

    ReplyDelete
  3. thanks so much

    ReplyDelete
  4. يسعي الكثير من العملاء للتعامل مع مراكز صيانة وايت وستنجهاوس لتواجد فيها جميع انواع الصيانة و يثقون بجميع الاعمال التي تقوم بها صيانة وستنجهاوس لتواجد فيها جميع الامكانيات التي يحتاجون اليها في اداء عملهم
    http://www.maintenanceg.com/White-Westinghouse-Center-Agent.html

    ReplyDelete
  5. تتميز شركة حراسات امنيةة بتواجد فيها خدمة تامين المشاريع تحت الانشاء لما يتواجد لديها من كثير من القدرات و الات التي تمكن شركة امن وحراسة من اداء جميع اعمالهم علي درجة كبيرة من الدقة
    http://www.guards-security.com/

    ReplyDelete
  6. تتميز جليسات مسنين في مصر التي تقوم بتوفيرهم دار مسنين بقدراتهم علي تقديم جميع انواع الرعاية المطلوبة
    http://www.careolder.com/

    ReplyDelete