OpenCV在iOS中添加面罩

时间:2017-08-29 12:09:21

标签: c++ ios objective-c opencv

我正在尝试实现像快照聊天这样的面部过滤器。我用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));

}

0 个答案:

没有答案