美文网首页
iOS_OpenCV前景图提取

iOS_OpenCV前景图提取

作者: Champion | 来源:发表于2018-06-26 09:27 被阅读24次
IMG_C91.jpeg

总之,目的就是如上图这样只显示窗帘部分,其他部分透明~

    UIImage *image = [UIImage imageNamed:@"100.jpg"];
    cv::Mat grayFrame, lastFrame, mask, bgModel, fgModel;
    UIImageToMat(image, lastFrame);
    cv::cvtColor(lastFrame, grayFrame,cv::COLOR_RGBA2BGR);// 转换成三通道bgr
    cv::Rect rectangle(1,1,grayFrame.cols - 2,grayFrame.rows - 2);// 检测的范围
    // 分割图像
    cv::grabCut(grayFrame, mask, rectangle, bgModel, fgModel, 3,cv::GC_INIT_WITH_RECT);// openCv强大的扣图功能

    int nrow = grayFrame.rows;
    int ncol = grayFrame.cols * grayFrame.channels();

    for(int j = 0; j < nrow; j ++){// 扣图,只显示前景

        for(int i = 0; i< ncol; i ++){

            uchar val = mask.at<uchar>(j,i);

            if(val == cv::GC_PR_BGD){

                grayFrame.at<cv::Vec3b>(j,i)[0]= '\255';

                grayFrame.at<cv::Vec3b>(j,i)[1]= '\255';

                grayFrame.at<cv::Vec3b>(j,i)[2]= '\255';

            }
        }
    }

    cv::cvtColor(grayFrame, grayFrame,cv::COLOR_BGR2RGB); //转换成彩色图片
    
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 100, image.size.width, image.size.height)];
    imageView.image = MatToUIImage(grayFrame);
    [self.view addSubview:imageView];

其实这种分割比较适用图片上前景和背景明显的图片,对于复杂的图片处理的效果就不够完美了。另外,处理速度很慢。

CV_EXPORTS_W void grabCut( InputArray img, InputOutputArray mask, Rect rect,
                           InputOutputArray bgdModel, InputOutputArray fgdModel,
                           int iterCount, int mode = GC_EVAL );

*img 待分割原图像,需为8位三通道彩色图像
*mask 8位单通道掩码图像,如果使用掩码进行初始化,那么mask保存掩码信息,在执行分割的时候,也可以将用户交互所设定的前景与背景保存到mask中,然后再传入grabCut函数,在处理结束之后,mask中会保存结果。Mask有4种值:


mask.png

*rect 包含分割对象的矩形ROI,矩形外部的像素为背景,矩形内部的像素为前景,当参数mode=GC_INIT_WITH_RECT使用
*bgdModel 背景模型(内部使用)
*fgdModel 前景模型(内部使用)
*iterCount 迭代次数,必须大于0
*mode 用来指示grabCut函数执行什么操作,可选的值有:


mode.png

相关文章

网友评论

      本文标题:iOS_OpenCV前景图提取

      本文链接:https://www.haomeiwen.com/subject/jmkpyftx.html