2012-06-13 2 views
4

해결 방법을 찾을 수없는 문제가 하나 있습니다.역행렬 OpenCV. Matrix.inv()가 제대로 작동하지 않습니다.

하나의 알려진 행렬의 역함수와 몇 가지 계산을해야합니다.

Matrix homography= 

1.1688, 0.23, 62.2, 

-0.013,1.225, -6.29, 

0, 0, 1, 

한 다음 :

Mat homoInv=homography.inv(); 

매트릭스의 내용은 다음과 같습니다 이미 matlab에에 결과를 확인으로 물론 잘못

1.81381e-29, 15.1628, -7.57361e+17, 

0, -0, 0, 

5.4561e-33, -2.40123e+34, -1.38198e-05 

있다. 두 매트릭스 모두 float로 표시되고 읽혀지며 깊이는 64FC1입니다.

누구에게 무슨 짓을 할 수 있는지 알고 있습니까?

감사합니다 모든

더 코드 :

int main(int argc, char ** argv) 
{ 
    Mat homogra(3,3,CV_64FC1); 
    Mat coord(3,1,CV_64FC1); 
    Mat result(target.size(),CV_8UC1); 
    homogra.at<float>(0,0)=1.1688; 
    homogra.at<float>(0,1)=0.23; 
    homogra.at<float>(0,2)=(-62.20); 
    homogra.at<float>(1,0)=(-0.013); 
    homogra.at<float>(1,1)=1.225; 
    homogra.at<float>(1,2)=-6.29; 
    homogra.at<float>(2,0)=0; 
    homogra.at<float>(2,1)=0; 
    homogra.at<float>(2,2)=1; 
    printMatrix(homogra); 

    Mat inverse=homogra.inv(); 
    printMatrix(inverse); 
} 

기능 printMatrix :

void printMatrix(Mat M){ 
cout<<"Tipo de matriz:"<<M.type()<<endl; 
// dont print empty matrices 
    if (M.empty()){ 
    cout << "---" << endl; 
    return; 
    } 
    // loop through columns and rows of the matrix 
    for(int i=0; i < M.rows; i++){ 
     for(int j=0; j < M.cols ; j++){ 
     cout << M.at<float>(i,j) << ", "<<endl; 
     } 
    cout<<"Change\n"<<endl; 
} 
    } 

그러나 오류가 난 별도로 요소를 인쇄하면 나는 이상한 같은 구 printMatrix에없는 역수의 결과.

+0

코드에 버그가 있습니다. 더 많은 도움이 필요하면 더 많은 코드를 게시해야합니다. – Peter

+0

이 매트릭스가 반전 가능합니까? 그렇지 않다면, 대신에 MATLAB이 pseudo-inverse를 계산할 가능성이 있습니다. –

+0

늦어지고 쓸모가 없지만'std :: cout << your_cv_mat << std :: endl;을하면 행렬이 출력됩니다. "printMatrix"와 같은 함수가 필요하지 않습니다. – Bastienm

답변

9

해결 : 문제는 베드로가 지적한 것처럼 내 코드에서 지적한 것입니다. 나는 여전히 그 이유를 깊이 이해하지 못한다. :

나는 CV_64F 데이터를 플로트로 취급했다. 실수가 아니므로 값을 쓰고 읽는 데 실수로 두 번 처리해야한다. (<double>)

그러나 CV_32F은 float로 처리 할 수 ​​있으며 액세스는 <float>입니다.

모두 안녕

+1

이유를 이해하는 데 도움이됩니다. 나는 Opencv가 그 타입을 메모리의 위치를 ​​얻기 위해 사용한다고 확신한다. 2D 배열의 index (i, j)의 경우, 메모리의 위치는 일반적으로 데이터의 시작 위치에서 index (i * number_of_columns + j) * (sizeof_variable_type)에 위치합니다. 기본 C++ 포인터 인덱싱에서는 포인터 유형을 사용하여 건너 뛸 바이트 수를 알 수 있습니다. 따라서 형식이 예상과 다를 경우 질문과 같이 잘못된 메모리 공간에 값을 할당하게됩니다. 결론은 예상 한 데이터에 반대 계산을하지 않은 것입니다. –

관련 문제