簡體   English   中英

OpenCV:EM算法訓練緩慢

[英]Opencv: EM algorithm training slowly

我正在嘗試使用opencv EM算法庫。

我試了一下EM算法,像一些例如這個這個第一,但我得到了這些代碼同樣的問題。 在EM培訓步驟中花了我很多時間。

這是我從該網站進行圖像分割的測試代碼:

#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中進行測試。

這是我的測試圖像

在這段代碼中,它向我顯示錯誤消息

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

我的第一個問題是:為什么EM訓練如此緩慢。 正常嗎

第二個問題是:我的代碼錯誤出了什么問題,還有沒有更好的示例讓我知道EM的用法?

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

我用這篇文章來修改像素,它的工作原理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM