OpenCV期望最大化

时间:2013-05-28 10:26:31

标签: opencv gaussian expectation-maximization

我正在尝试在OpenCV 2.4.5上使用EM来进行背景和前景图像分离。但是,与以前版本的C类不同,c ++对我来说非常困惑,而且由于缺少文档(从我的观点来看......),几个例程相当混乱。

我写了下面的代码,但似乎没有用。它给出了错误,我努力调试但仍然无法正常工作。

Mat image;
image = imread("rose.jpg",1);

Mat _m(image.rows, image.cols, CV_32FC3);
Mat _f(image.rows, image.cols, CV_8UC3);
Mat _b(image.rows, image.cols, CV_8UC3);

Mat sample(image.rows * image.cols, 3, CV_32FC1);

Mat float_image;
image.convertTo(float_image,CV_64F);

Mat background_ = Mat(image.rows * image.cols, 3, CV_64F);

int counter = 0;
//Converting from Float image to Column vector
for (int j = 0; j < image.rows; j++)
{
    Vec3f* row = float_image.ptr<Vec3f > (j);

    for (int i = 0; i < image.cols; i++)
    {
        sample.at<Vec3f> (counter++, 0) = row[i];
    }
}

//sample.reshape(1,image.rows * image.cols);
cout<<"Training"<<endl;
EM params = EM(2);
params.train(sample);
    Mat _means = params.get<Mat>("means");
Mat _weights = params.get<Mat> ("weights");
cout<<"Finished Training"<<endl;

基本上,我将图像转换为CV_64F类型的float并将其传递给训练例程。也许我认为我错了,我可以得到我的错误的帮助。谢谢

1 个答案:

答案 0 :(得分:3)

您正在混合浮动类型。

如果您需要双精度,请将Vec3f更改为Vec3d

否则

image.convertTo(float_image,CV_64F);
Mat background_ = Mat(image.rows * image.cols, 3, CV_64F);

应该是

image.convertTo(float_image,CV_32F);
Mat background_ = Mat(image.rows * image.cols, 3, CV_32F);