2012-07-07 2 views
2

У вас возник вопрос о том, как использовать алгоритм EM в последнем OpenCV 2.4.2. Раньше я использовал версию C, и она отлично работала, но с момента обновления системы кажется, что API C был удален в OpenCV 2.4.2.Как использовать CV :: EM класс в OpenCV 2.4.2?

Это простой случай для EM: предположим, что у меня есть список радиуса, который считается состоящим из двух видов шаров, и я хочу оценить среднее/дисперсию этих двух типов. Другими словами, это одномерная проблема.

Я попытался написать версию EM на C++, используя новые API, но пока не получил ее.

int nsamples = radius_list.size(); 
int ncluster = 2;     //we assume a bimodal model 
Mat samples = Mat::zeros(nsamples, 1, CV_32FC1); 

// init data 
for (int i = 0; i < radius_list.size(); ++i) { 
    int value = radius_list[i]; 
    samples.at<float>(i, 0) = value; 
} 
EM em_model = EM(ncluster, EM::COV_MAT_SPHERICAL); 

if (!em_model.train(samples)) { 
    cerr << "error training the EM model" << endl; 
    exit(-1); 
} 

const Mat& means = em_model.get<Mat>("means"); 
int mean1 = means.at<float>(0, 0); 
int mean2 = means.at<float>(1, 0); 
cout << "mean1 = " << mean1 << ", mean2 = " << mean2 << endl; 

const vector<Mat>& covs = em_model.get<vector<Mat> >("covs"); 
int scale1 = covs[0].at<float>(0, 0); 
int scale2 = covs[1].at<float>(0, 0); 
cout << "scale1 = " << scale1 << ", scale2 = " << scale2 << endl; 

Проблема в том, хотя, если() не жалуюсь, извлеченный среднее значение и масштаб значения являются значения барахла, -2147483648 на моей машине.

Просьба сообщить, как изменить код, чтобы заставить его работать. Я все еще изучаю всевозможные C++ API в OpenCV.

Спасибо всем!

+0

C API на самом деле не удален. Теперь он находится в opencv_legacy –

+0

Цените Андрея! Через некоторое время тестирования/запуска я получил API C обратно в код, и, похоже, он работает отлично! Хотя я могу продолжать использовать API-интерфейсы C, мне также интересно перейти на C++ API. Любые предложения по вышеуказанному коду? – galactica

+0

Я советую вам получить исходный код OpenCV и изучить реализацию старого API. Он реализуется как оболочка для нового класса EM. Надеюсь, что в коде вы найдете подробности. –

ответ

5

Выполнение неявных преобразований типов, которые отвлекают компилятор. Средний, вес и матрица ковариации не Интс, но двойники (вы можете проверить его на печати Mat.depth() приведут к экрану), чтобы изменить все строки из:

int mean1 = means.at<float>(0, 0); 

как код для:

double mean1 = means.at<double>(0, 0); 

С уважением, Rafal

Смежные вопросы