2013-05-28 73 views
2

我想在OpenCV 2.4.5上使用EM進行背景和前景圖像分離。然而,不同於以前版本的C類,C++對我來說非常混亂,而且由於缺少文檔(從我的觀點來看,幾個例程相當混亂)。OpenCV期望最大化

我寫了下面的代碼,但它似乎不是工作。它給錯誤,我很努力地調試,但仍然無法正常工作。

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的浮動並將其傳遞到訓練例程中。也許我認爲我錯了,能否幫我解決我的錯誤。謝謝

+0

首先添加你的錯誤。 – jnovacho

回答

2

你在混合你的浮點類型。

如果您需要雙精度,請將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);