2011-09-28 4 views
2

OpenCV에서 픽셀 좌표를 유지하는 PCA 모델을 만들려고합니다. 실험으로 두 개의 근사한 원을 매핑하는 두 세트의 픽셀 좌표가 있습니다. coordiantes의 각 세트는 48 x, y 쌍을 가지고 있습니다. 파일에서 좌표를 읽고 매트 구조에 저장하는 다음 코드를 실험하고있었습니다. 그러나 나는 그것이 옳다고 생각하지 않으며 openCV의 PCA가 인터넷에서 매우 잘 처리되지 않는 것으로 보입니다.OpenCV PCA 질문

Mat m(2, 48, CV_32FC2); // matrix with 2 rows of 48 cols of floats held in two channels 

pFile = fopen("data.txt", "r"); 

for (int i=0; i<48; i++){ 
    int x, y; 
    fscanf(pFile, "%d%c%c%d%c", &x, &c, &c, &y, &c); 

    m.at<Vec2f>(0 , i)[0] = (float)x; // store x in row 0, col i in channel 0 
    m.at<Vec2f>(0 , i)[1] = (float)y; // store y in row 0, col i in channel 1 

} 

for (int i=0; i<48; i++){ 
    int x, y; 
    fscanf(pFile, "%d%c%c%d%c", &x, &c, &c, &y, &c); 

    m.at<Vec2f>(1 , i)[0] = (float)x; // store x in row 1, col i in channel 0 
    m.at<Vec2f>(1 , i)[1] = (float)y; // store y in row 1, col i in channel 1 

} 

PCA pca(m, Mat(), CV_PCA_DATA_AS_ROW, 2); // 2 principle components??? Not sure what to put here e.g. is it 2 for two data sets or 48 for number of elements? 

    for (int i=0; i<48; i++){ 
float x = pca.mean.at<Vec2f>(i,0)[0]; //get average x 
    float y = pca.mean.at<Vec2f>(i,0)[1]; //get average y 
    printf("\n x=%f, y=%f", x, y); 
} 

그러나 pca 개체를 만들 때이 충돌이 발생합니다. 나는 이것이 매우 기본적인 질문이라는 것을 알고 있지만, 나는 조금 잃어 버렸고 누군가가 나를 open cv에서 pca로 시작할 수 있기를 바랬다.

+0

[OpenCV 설명서의 PCA 섹션] (http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html#pca)을 보았습니까? –

답변

3

아마도 PCA를 사용하기 위해 필요한 것이고 달성하고자하는 것이 무엇인지 (출력?) 더 자세하게 설명하면 도움이 될 것입니다.

프로그램이 충돌하는 이유는 입력 매트가 CV_32FC2이고 CV_32FC1이어야하기 때문입니다. 필요한 것을 모르는 상태에서 PCA를 사용하기 전에 데이터를 1 차원 행 벡터로 재구성해야합니다. 데이터를 재구성하는 방법을 말할 수 없습니다. (이미지가있는 일반적인 응용 프로그램은 이미지가 행 벡터로 재 형성되어야하는 eigenFace입니다. 또한 입력 데이터를 0에서 1 사이로 정규화해야합니다.

마지막으로 주 구성 요소가 다른 구성 요소와 직교하기 때문에 일반적으로 입력 구성 요소의 수보다 1보다 적은 주 구성 요소를 유지하도록 선택합니다 .

저는 이전에 opencv PCA와 함께 일해 왔으며 더 이상 지원하고 싶습니다. 이 블로그 (http://www.bytefish.de/blog/pca_in_opencv)를 참조하면 openCV에서 PCA를 시작할 수 있습니다.

+0

안녕 케빈, 대답 해 주셔서 감사 드리며 나는 굴뚝에 아팠다. 내가하려고하는 것은 이미지 내의 입에 대한 pca 모델을 만드는 것입니다. 내가하는 일은 두 개의 이미지에서 입 주변 샘플 포인트이며 샘플 포인트를 기반으로 pca 모델을 만들고 싶습니다. 따라서 첫 번째 이미지에는 나방 모양을 따르는 48 (x, y) 좌표가 있고 두 번째 이미지에는 다른 입에 대해 또 다른 48 점이 있습니다. 나는 평균 입 좌표를 얻고 싶다. 유용한 온라인 리소스를 찾으려고했지만 행운이 없었습니다. – user969776

+0

추천 한 블로그를 유용하게 보입니다. 원하는 모델을 만드는 방법에 대한 추가 힌트와 팁은 매우 높이 평가 될 것입니다. (귀하 또는 다른 누군가가 시간을 갖고 있다면) ... – user969776

+0

안녕 케빈, 다시 도와 줘서 고마워. CV_32FC1을 사용하여 컴파일 된 코드를 얻었고 사용자가 말한대로 데이터를 정규화했습니다. 더 많은 경험을 가진 사람으로부터 얻은 몇 가지 힌트가 Google에서 답을 찾으려는 마음을 아프게하는 것은 재미 있습니다. 인터넷에는 PCA에 대한 여러 가지 유용한 자료가 있지만 OpenCV를 사용하는 PCA의 예는 거의 없습니다. 그래서 당신의 도움을 많이 주셔서 감사합니다, 그것에 자리했다 !!! – user969776