已知背景像素值情况下获取前景像素

 

void Get_fg_mask_New(int *bg_color, Mat &samples, Parameters Paras, Mat &k_img, vector<pair<int, int>> &UnzeroValue, bool flag)
{
    float csaturation = 0.0;
    float cvalue = 0.0;
    int kmax = Quick_search(bg_color, CHANNELS);
    int kmin = Quick_search(bg_color, CHANNELS, false);
    int cdelta = bg_color[kmax] - bg_color[kmin];
    csaturation = bg_color[kmax] == 0 ? 0 : ((float)cdelta) / ((float)bg_color[kmax]);
    cvalue = ((float)bg_color[kmax]) / 255.0;
    Mat SaturationMat(samples.rows, samples.cols, CV_32FC1,Scalar::all(csaturation));
    Mat CvalueMat(samples.rows, samples.cols, CV_32FC1, Scalar::all(cvalue));
    Mat perPixelS = Mat::zeros(samples.rows, samples.cols, CV_32FC1);
    Mat perPixelC = Mat::zeros(samples.rows, samples.cols, CV_32FC1);
    Mat perPixelSdiff = Mat::zeros(samples.rows, samples.cols, CV_32FC1);
    Mat perPixelCdiff = Mat::zeros(samples.rows, samples.cols, CV_32FC1);
    Mat SfgMat = Mat::zeros(samples.rows, samples.cols, CV_8UC1);
    Mat CfgMat = Mat::zeros(samples.rows, samples.cols, CV_8UC1);
    Mat FgMask = Mat::zeros(samples.rows, samples.cols, CV_8UC1);
    Rgb_to_sv_New(samples, perPixelS, perPixelC);
    perPixelSdiff = abs(perPixelS - SaturationMat);
    perPixelCdiff = abs(perPixelC - CvalueMat);
    SfgMat = perPixelSdiff >= Paras.sat_threshold;
    CfgMat = perPixelCdiff >= Paras.value_threshold;
    FgMask = SfgMat | CfgMat;
    Mat CH3_fgMat = Mat::zeros(samples.rows, samples.cols, CV_8UC3);
    vector<Mat>Channels;
    for (int i = 0;i < CHANNELS;i++) //单通道转三通道图像;
        Channels.push_back(FgMask);
    merge(Channels, CH3_fgMat);
    k_img = CH3_fgMat & samples;
    for (int i = 0;i < k_img.rows;i++)
    {
        uchar* p = k_img.ptr<uchar>(i);
        for (int j = 0;j < k_img.cols*CHANNELS;j=j+ CHANNELS)
        {
            if ((max(p[j], max(p[j + 1], p[j + 2]))) == 0)
                continue;
            if (flag)
            {
                pair<int, int>temp;
                temp.first = i;
                temp.second = j/ CHANNELS;
                UnzeroValue.push_back(temp);
            }
        }
    }
}

代码为本人原创,转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值