2012-05-02 3 views
8

opencv 설명자 추출기의 '계산'방법을 사용하여 얻은 설명자 행렬의 값을 인쇄하는 데 문제가 있습니다. 필자는 하나의 기능에 대한 설명자를 하나씩 파일에 인쇄하려고하지만 항상 'at'가있는 설명자 행렬의 일부 요소에 액세스하면 그 요소에 대해 다른 값을받습니다. 다음은 '에서'사용시 'for'루프 I가 디스크립터 행렬의 출력 값을 테스트하는데 사용 :키포인트 설명자 행렬의 값 인쇄 opencv

for(int i=0; i<nF; i++){ 

    if(lpx != keypoints[i].pt.x && lpy != keypoints[i].pt.y){ 
     usedFeatures++; 
     cerr << descriptors.row(i) << endl << endl; // printing row of descriptor matrix 
     fileS << keypoints[i].pt.y << " " << keypoints[i].pt.x << " "; 
     fileS << keypoints[i].size << " " << keypoints[i].angle << endl; 

     if(i == nF - 2){ 
      //printing subvector of descriptor matrix made of the element at row i and col 0 
      cerr << "get row i, col 0 " << descriptors.row(i).col(0) << endl; 

      //same as before just inverting the order of access 
      cerr << "get col 0, row i: " << descriptors.col(0).row(i) << endl; 


      //printing the value of the element with 'at' 
      cerr << (int)descriptors.at<uchar>(i, 0); 

      //creating a new int and giving it the value of element (i, 0) of descriptor matrix. Should be the same 
      //value shown on the subvector before 
      int test = descriptors.at<uchar>(i, 0); 

      //printing value of element 
      cerr << "i, 0: " << test << endl; 
     } 

제 I 인쇄 값을보고했다 '가'테스트는 '가' 설명자의 요소에 액세스 할 때 - 이제, nF의에서

cerr << descriptors.row(i) << endl << endl; 

인쇄이 iteraction, 나는 다음과 같은 결과가 있습니다

:
[20, 11, 0, 18, 51, 3, 0, 3, 133, 50, 0, 0, 0, 0, 0, 11, 133, 18, 0, 0, 0, 0, 0, 3, 
119, 2, 0, 0, 0, 0, 0, 2, 19, 5, 0, 4, 55, 27, 1, 1, 133, 25, 0, 1, 4, 1, 0, 22, 133, 
18, 0, 0, 0, 0, 0, 14, 131, 13, 1, 0, 0, 0, 0, 1, 12, 1, 0, 1, 56, 133, 25, 13, 133, 
14, 0, 0, 3, 8, 20, 80, 133, 38, 0, 0, 0, 0, 0, 51, 106, 11, 1, 0, 0, 0, 0, 23, 0, 0, 
0, 0, 19, 126, 70, 11, 23, 0, 0, 0, 0, 9, 83, 133, 53, 1, 0, 0, 0, 0, 2, 133, 26, 
3, 2, 0, 0, 0, 0, 28] 

그리고 예상대로, 두 번째 '경우'내부의 처음 두 인쇄

cerr << "get row i, col 0 " << descriptors.row(i).col(0) << endl; 

cerr << "get col 0, row i: " << descriptors.col(0).row(i) << endl; 

이 날 줄 [20]

그러나 다른 두 인쇄

,691 '에'와 요소에 액세스하고이를 인쇄 할 때
cerr << (int)descriptors.at<uchar>(i, 0); 

int test = descriptors.at<uchar>(i, 0); 
cerr << "i, 0: " << test << endl; 

나에게 내가 전에 보여 I 라인 NF-2 한 전체 결과를 0 대신 20을 제공했다 :

0 0 160 65 0 0 48 65 0 0 0 0 0 0 144 65 0 0 76 66 
0 0 64 64 0 0 0 0 0 0 64 64 0 0 5 67 0 0 72 66 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 48 65 0 0 5 67 0 0 144 65 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 64 0 0 238 66 
0 0 0 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 64 

내가 예상했던 것과 완전히 다른 것은 무엇입니까? 나는 이미 많은 것들을 시도해 봤다 : float, double, int 대신에 unsigned int로 캐스팅하고, 그 타입의 변수에도 할당한다. 매트릭스를 복사 한 다음 변환하여 다른 유형의 설명자 행렬을 작성합니다.하지만 그 중 아무 것도 작동하지 않습니다. 나는 그것이 거의 uchar 유형 (나는 elemSize로 확인했다)을 가지고 있다고 확신하지만, 설명자 행렬의 유형과 관련이 있다고 생각한다.

미리 감사드립니다. 제 영어와 문제.

답변

7

답을 찾았습니다. 참으로 타입 문제였습니다. 에 의해 반환 된 설명자 행렬의 유형은 내가 생각한 것처럼 uchar이 아니며 실제로는 부동입니다.

으로 값 받기
(float)descriptors.at<float>(i, 0); 

이 올바른 가치를 제공합니다. 웃기는 일은 내가 전에 플로트로 해봤다고 맹세 할 수있다. int, double 및 unsigned int에 대해서만 시도했을 것입니다.

1

이것은 문제가 발생하는 이유에 대해서는 답변하지 않지만 내 설명자 값에 액세스 할 때 비슷한 문제가 있음을 기억합니다.

OpenCV에 여러 개의 cv::DescriptorExtractor이 구현되어있어 어떤 설명자와도 호환되는 코드를 작성하려고했습니다. 문제는 언젠가 내 서술자 인터페이스와 함께 작동하는 내 자신의 OpenCV 독립 라이브러리를 만들고 싶기 때문에 std::vector<vector<double> > 구조의 모든 설명자를 원했습니다.

cv::DescriptorExtractor *descCalc; 

// initialize descCalc 

descCalc->compute(*image, feats, descOld); 

// conversion to std::vector<std::vector <double> > : 

const double *temp; 
desc.clear(); 
desc.reserve(descOld.cols); 
for (int i=0, szi = this->desc.rows; i < szi; ++i){ 
    temp = descOld.ptr<double>(i); 
    desc.push_back(std::vector<double>(temp, temp+descOld.cols)); 
} 

assert(desc.size() == descOld.rows); 
assert(desc[0].size() == descOld.cols); 

는 어떤 희망이 도움 :

여기 cv::Mat descOld std::vector< std::vector <double> > desc에 변환 내 코드입니다.

+0

감사! 문제가 해결되지 않더라도 앞으로이 변환이 도움이 될 수 있으므로 답변 해 주시면 감사하겠습니다. –

+0

@Alberto A 문제의 "이유"에 대한 대답은 아니지만 설명어에 '이중'으로 액세스하려고 시도 할 수 있습니다. 필자의 경우,'temp'는 단지 행의 시작에 대한 포인터 일 뿐이지 만'temp'를 사용하여 행의 첫 번째 요소를 얻으려면'double val = * temp'를 사용해야합니다. 어쩌면 그렇게 해볼까? 나는 또한 디스크립터에 접근하기위한 적절한 유형을 찾는 것이 어려웠다. – penelope