2015-06-09 137 views
0

我想使用opencv EM算法庫。Opencv:EM算法慢慢培訓

我嘗試了一些關於EM算法的例子,比如thisthis,但是我在這些代碼中遇到了同樣的問題。 EM培訓步驟需要我很多時間。

這是this website的圖像分割我的測試代碼:

#include <opencv2/opencv.hpp> 
#include <opencv2/legacy/legacy.hpp> 
using namespace std; 
using namespace cv; 
Mat asSamplesVectors(Mat& img); 
/** @function main */ 
int main(int argc, char** argv) 
{ 
    Mat image; int no_of_clusters = 2; 
    image = imread("images/flower.jpg"); 
    Mat samples = asSamplesVectors(image); 

    cout << "Starting EM training" << endl; 
    EM em(no_of_clusters); 
    em.train(samples); 
    cout << "Finished training EM" << endl; 

    vector<Mat> segmented; 
    for (int i = 0; i < no_of_clusters; i++) 
     segmented.push_back(Mat::zeros(image.rows, image.cols, CV_8UC3)); 

    int index = 0; 
    for (int y = 0; y < image.rows; y++) { 
     for (int x = 0; x < image.cols; x++) { 
      int result = em.predict(samples.row(index++))[1]; 
      segmented[result].at<Point3i>(y, x, 0) = image.at<Point3i>(y, x, 0); 
     } 
    } 
    imshow("result", samples); 
    return(0); 
} 

Mat asSamplesVectors(Mat& img) { 
    Mat float_img; 
    img.convertTo(float_img, CV_32F); 

    Mat samples(img.rows * img.cols, 3, CV_32FC1); 

    /* Flatten */ 
    int index = 0; 
    for (int y = 0; y < img.rows; y++) { 
     Vec3f* row = float_img.ptr<Vec3f>(y); 
     for (int x = 0; x < img.cols; x++) 
      samples.at<Vec3f>(index++, 0) = row[x]; 
    } 
    return samples; 
} 

我在VS2013測試,OpenCV的2.4.9和OpenCV 2.4.11。

這是我的測試image

在此代碼中,它顯示錯誤message

錯誤步驟是segmented[result].at<Point3i>(y, x, 0) = image.at<Point3i>(y, x, 0);

第一個問題是:爲什麼EM訓練如此緩慢。這是正常的嗎?

第二個問題是:我的代碼錯誤有什麼問題,有沒有更好的例子讓我知道EM的用法?

回答

0

我找到了第一個問題的答案,我的測試圖像太大而無法訓練。 訓練圖像的大小需要縮小。

我使用這個article修改像素,它的工作原理。