2012-07-07 3 views
2

최신 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를 배우고 있습니다.

감사합니다.

+0

C API가 실제로 제거되지 않습니다. 이제는 opencv_legacy에 있습니다. –

+0

Andrey 감사합니다! 테스트/실행 중에 잠시 후에 C 코드를 코드로 가져 왔고 정상적으로 작동하는 것 같습니다! C API를 계속 사용할 수는 있지만 C++ API로 이동하는 것도 궁금합니다. 위의 코드에 대한 제안 사항은 무엇입니까? – galactica

+0

OpenCV 소스를 얻고 이전 API의 구현을 연구하도록 조언합니다. 새로운'EM' 클래스의 래퍼로 구현됩니다. 코드에서 누락 된 세부 정보를 찾으십시오. –

답변

5

컴파일러에서 혼란 스러울 수있는 암시 적 유형 변환을 수행합니다. 무게와 공분산 행렬의 int하지만 복식없는, 평균 (당신은 Mat.depth() 화면에 결과를 인쇄하여 확인하실 수 있습니다) 그래서 모든 라인 변경 : 코드처럼

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

을 :

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

감사합니다. Rafal

관련 문제