在论坛下载的贝叶斯抠图代码,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