CapChris 2019-09-04 10:00 采纳率: 0%
浏览 270
已结题

运用贝叶斯进行绿幕抠像时出现没有与参数列表匹配的重载函数实例错误

在论坛下载的贝叶斯抠图代码,open cv3.4环境下运行时出现报错

void BayesianMatting::SolveBF(int r, int c, CvMat* fg_mean, CvMat* inv_fg_cov, CvMat* bg_mean, CvMat* inv_bg_cov)
{
    CvMat* A = cvCreateMat(6, 6, CV_32FC1);
    CvMat* x = cvCreateMat(6, 1, CV_32FC1);
    CvMat* b = cvCreateMat(6, 1, CV_32FC1);
    CvMat* I = cvCreateMat(3, 3, CV_32FC1);
    CvMat* work_3x3 = cvCreateMat(3, 3, CV_32FC1);
    CvMat* work_3x1 = cvCreateMat(3, 1, CV_32FC1);

    float alpha = CV_IMAGE_ELEM(alphamap, float, r, c);
    CvScalar fg_color = cvScalar(CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c), CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c + 1), CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c + 2));
    CvScalar bg_color = cvScalar(CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c), CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c + 1), CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c + 2));
    CvScalar  c_color = cvScalar(CV_IMAGE_ELEM(colorImg, uchar, r, 3 * c), CV_IMAGE_ELEM(colorImg, uchar, r, 3 * c + 1), CV_IMAGE_ELEM(colorImg, uchar, r, 3 * c + 2));

    float inv_sigmac_square = 1.f / (sigmac * sigmac);

    cvZero(I);
    CV_MAT_ELEM(*I, float, 0, 0) = CV_MAT_ELEM(*I, float, 1, 1) = CV_MAT_ELEM(*I, float, 2, 2) = 1.f;

    ////a
    cvCvtScale(I, work_3x3, alpha * alpha * inv_sigmac_square);
    cvAdd(inv_fg_cov, work_3x3, work_3x3);
    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
            CV_MAT_ELEM(*A, float, i, j) = CV_MAT_ELEM(*work_3x3, float, i, j);

    //
    cvCvtScale(I, work_3x3, alpha * (1 - alpha) * inv_sigmac_square);
    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
            CV_MAT_ELEM(*A, float, i, 3 + j) = CV_MAT_ELEM(*A, float, 3 + i, j) = CV_MAT_ELEM(*work_3x3, float, i, j);

    //
    cvCvtScale(I, work_3x3, (1 - alpha) * (1 - alpha) * inv_sigmac_square);
    cvAdd(inv_bg_cov, work_3x3, work_3x3);
    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
            CV_MAT_ELEM(*A, float, 3 + i, 3 + j) = CV_MAT_ELEM(*work_3x3, float, i, j);

    ////x
    cvZero(x);

    ////b
    cvMatMul(inv_fg_cov, fg_mean, work_3x1);
    for (int i = 0; i < 3; ++i)
        CV_MAT_ELEM(*b, float, i, 0) = CV_MAT_ELEM(*work_3x1, float, i, 0) + (float)c_color.val[i] * alpha * inv_sigmac_square;
    //
    cvMatMul(inv_bg_cov, bg_mean, work_3x1);
    for (int i = 0; i < 3; ++i)
        CV_MAT_ELEM(*b, float, 3 + i, 0) = CV_MAT_ELEM(*work_3x1, float, i, 0) + (float)c_color.val[i] * (1 - alpha) * inv_sigmac_square;


    //
    cvSolve(A, b, x);
    CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c) = max(0, min(255, CV_MAT_ELEM(*x, float, 0, 0)));
    CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c + 1) = max(0, min(255, CV_MAT_ELEM(*x, float, 1, 0)));
    CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c + 2) = max(0, min(255, CV_MAT_ELEM(*x, float, 2, 0)));
    CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c) = max(0, min(255, CV_MAT_ELEM(*x, float, 3, 0)));
    CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c + 1) = max(0, min(255, CV_MAT_ELEM(*x, float, 4, 0)));
    CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c + 2) = max(0, min(255, CV_MAT_ELEM(*x, float, 5, 0)));

    cvReleaseMat(&A), cvReleaseMat(&x), cvReleaseMat(&b), cvReleaseMat(&I), cvReleaseMat(&work_3x3), cvReleaseMat(&work_3x1);
}
inline void BayesianMatting::SolveAlpha(int r, int c)
{
    CV_IMAGE_ELEM(alphamap, float, r, c) =
        (((float)CV_IMAGE_ELEM(colorImg, uchar, r, 3 * c) - (float)CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c)) * ((float)CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c) - (float)CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c))
            + ((float)CV_IMAGE_ELEM(colorImg, uchar, r, 3 * c + 1) - (float)CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c + 1)) * ((float)CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c + 1) - (float)CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c + 1))
            + ((float)CV_IMAGE_ELEM(colorImg, uchar, r, 3 * c + 2) - (float)CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c + 2)) * ((float)CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c + 2) - (float)CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c + 2))
            ) /
            (
        ((float)CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c) - (float)CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c)) * ((float)CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c) - (float)CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c))
                + ((float)CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c + 1) - (float)CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c + 1)) * ((float)CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c + 1) - (float)CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c + 1))
                + ((float)CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c + 2) - (float)CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c + 2)) * ((float)CV_IMAGE_ELEM(fgImg, uchar, r, 3 * c + 2) - (float)CV_IMAGE_ELEM(bgImg, uchar, r, 3 * c + 2))
                );

    CV_IMAGE_ELEM(alphamap, float, r, c) = max(0, min(1, CV_IMAGE_ELEM(alphamap, float, r, c)));
}

恳请大佬帮看看是为什么出错了,用的是VS2019
图片说明图片说明

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2019-09-05 00:17
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝