我正在尝试实现像快照聊天这样的面部过滤器。我用opencv来识别脸部,但是我无法添加面具。
这是我的代码:
- (void)processImage:(Mat&)image;
{
Mat grayscaleFrame;
cvtColor(image, grayscaleFrame, CV_BGR2GRAY);
equalizeHist(grayscaleFrame, grayscaleFrame);
std::vector<cv::Rect> faces;
faceCascade.detectMultiScale(grayscaleFrame, faces, 1.1, 10, HaarOptions, cv::Size(60, 60));
for (int i = 0; i < faces.size(); i++)
{
cv::Point pt3(faces[i].x + faces[i].width/2, faces[i].y + 20);
cv::Size size(50,50);
[self putMask:image placePoint:pt3 facesize:size];
}
}
此代码用于添加掩码:
- (void)putMask:(Mat&)image placePoint:(cv::Point)center facesize:(cv::Size)face_size
{
Mat mask1,src1;
resize(mask,mask1,face_size);
cv::Rect roi(center.x - face_size.width/2, center.y - face_size.width/2, face_size.width, face_size.width);
image(roi).copyTo(src1);
Mat mask2,m,m1;
threshold(mask2,mask2,230,255,CV_THRESH_BINARY_INV);
std::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;
std::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(image(roi));
}