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로 확인했다)을 가지고 있다고 확신하지만, 설명자 행렬의 유형과 관련이 있다고 생각한다.
미리 감사드립니다. 제 영어와 문제.
감사! 문제가 해결되지 않더라도 앞으로이 변환이 도움이 될 수 있으므로 답변 해 주시면 감사하겠습니다. –
@Alberto A 문제의 "이유"에 대한 대답은 아니지만 설명어에 '이중'으로 액세스하려고 시도 할 수 있습니다. 필자의 경우,'temp'는 단지 행의 시작에 대한 포인터 일 뿐이지 만'temp'를 사용하여 행의 첫 번째 요소를 얻으려면'double val = * temp'를 사용해야합니다. 어쩌면 그렇게 해볼까? 나는 또한 디스크립터에 접근하기위한 적절한 유형을 찾는 것이 어려웠다. – penelope