Why do you want to detect face? In general, face detection is used in many areas, such as auto focusing, game, etc. Today, we will make a program to synthesize images on the face by using face detection.
First, we need a "haarcascade_frontalface_alt2.xml" file. This is used for face detect algorithm. We can take this file in following url.
https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt2.xml
And also we need images to synthesize on the face. I made a simple animal head for you.
Now, let's start make face detecting program. The full code is as follows.
preprogress.h
main.cpp
https://canysway.blogspot.kr/2018/05/opencv-tutorial-image-synthesis-roi.html
First, we need a "haarcascade_frontalface_alt2.xml" file. This is used for face detect algorithm. We can take this file in following url.
https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt2.xml
And also we need images to synthesize on the face. I made a simple animal head for you.
Now, let's start make face detecting program. The full code is as follows.
preprogress.h
#ifndef DETACTFACE_PREPROGRASS_H#define DETACTFACE_PREPROGRASS_H #include <opencv2/opencv.hpp> using namespace cv; using namespace std; //load specific cascade file
void load_cascade(CascadeClassifier& cascade, string frame){ string path = "./res/haarcascades/"; string full_path = path + frame; CV_Assert(cascade.load(full_path)); //CV_Assert is like error exception } // convert image coloar to grayMat
convertToGray(Mat img){ Mat gray; cvtColor(img, gray, CV_BGR2GRAY); equalizeHist(gray, gray); return gray; } // synthesize image and detect face roi
Mat getResultImg(Mat originMat, Mat maskMat, Rect roiRect){ Mat grayMask; Mat mask_inv; cvtColor(maskMat, grayMask, CV_BGR2GRAY); threshold(grayMask, grayMask, 10, 255, 0); bitwise_not(grayMask, mask_inv); Mat imgRoi; imgRoi = originMat(roiRect); Mat back; Mat mask_for; bitwise_and(maskMat, maskMat, mask_for, grayMask); bitwise_and(imgRoi, imgRoi, back, mask_inv); Mat dst; add(back, mask_for, dst); dst.copyTo(imgRoi); return originMat; } #endif //DETACTFACE_PREPROGRASS_H
main.cpp
#include <iostream> #include "preprograss.h" using namespace std; using namespace cv; int main() { CascadeClassifier face_cascade, eyes_cascade; load_cascade(face_cascade, "haarcascade_frontalface_alt2.xml"); Mat animalImg = imread("./res/pic/animal_head.png"); Mat frame; VideoCapture stream(0); if(!stream.isOpened()) cout << "Cannot open camera"; while (1){ if (!(stream.read(frame))) break; flip(frame, frame, 1); // flip image left and right
Mat gray = convertToGray(frame); vector<Rect> faces, eyes; face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0, Size(100, 100)); // detect face
if(faces.size() > 0){ // rectangle(frame, faces[0], Scalar(0,0,255), 3);
Mat newAni; float ratio = faces[0].width/animalImg.size().width; // get ratio detected face's width and animal image's width
int ani_height = (int)(animalImg.size().height * ratio); // get animal image's height for resizing
resize(animalImg, newAni, Size(faces[0].width, ani_height)); int pointY = (faces[0].y - ani_height) > 0 ? (faces[0].y - ani_height) : 0; // if y coordinate is negative, it is zero
frame = getResultImg(frame, newAni, Rect(faces[0].x, pointY, newAni.size().width, newAni.size().height)); } imshow("detact face", frame); if (waitKey(5) >= 0) break; } return 0; }
- Detect face
face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0, Size(100, 100));
void detectMultiScale( InputArray image, CV_OUT std::vector<Rect>& objects, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size() );
- Masking Images
https://canysway.blogspot.kr/2018/05/opencv-tutorial-image-synthesis-roi.html
// synthesize image and detect face roiMat getResultImg(Mat originMat, Mat maskMat, Rect roiRect){ Mat grayMask; Mat mask_inv;
....
Comments
Post a Comment