최신 OpenCV 2.4.2에서 EM 알고리즘을 사용하는 방법에 대한 질문이 있습니다. C 버전을 사용했는데 완벽하게 작동했지만 OpenCV 2.4.2에서 C API가 제거 된 것처럼 보입니다.OpenCV 2.4.2에서 CV :: EM 클래스를 사용하는 방법은 무엇입니까?
이것은 EM에 대한 간단한 사례입니다. 두 종류의 볼로 간주되는 반지름 목록이 있다고 가정하고이 두 유형의 평균/분산을 추정하고 싶습니다. 즉, 1 차원 문제입니다.
새로운 API를 사용하여 EM의 C++ 버전을 작성하려고했지만 아직 작동하지 않았습니다.
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 값 있지만.
작동하도록 코드를 수정하는 방법에 대해 조언하십시오. OpenCV에서 모든 종류의 C++ API를 배우고 있습니다.
감사합니다.
C API가 실제로 제거되지 않습니다. 이제는 opencv_legacy에 있습니다. –
Andrey 감사합니다! 테스트/실행 중에 잠시 후에 C 코드를 코드로 가져 왔고 정상적으로 작동하는 것 같습니다! C API를 계속 사용할 수는 있지만 C++ API로 이동하는 것도 궁금합니다. 위의 코드에 대한 제안 사항은 무엇입니까? – galactica
OpenCV 소스를 얻고 이전 API의 구현을 연구하도록 조언합니다. 새로운'EM' 클래스의 래퍼로 구현됩니다. 코드에서 누락 된 세부 정보를 찾으십시오. –