0
我想使用opencv EM算法庫。Opencv:EM算法慢慢培訓
我嘗試了一些關於EM算法的例子,比如this和this,但是我在這些代碼中遇到了同樣的問題。 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的用法?