2013-03-29 4 views
6

복잡한 행렬의 역함을 수행하는 데 어려움이 있습니다. 내가 아는 한, 복잡한 행렬은 단순히 2 채널 행렬 (CV_32FC2/CV_64FC2)입니다.OpenCV에서 복소수 행렬에 역함수를 적용하는 방법은 무엇입니까?

의 내가 매트릭스 C 있다고 가정 해 봅시다 :

OpenCV Error: Assertion failed (type == CV_32F || type == CV_64F) in invert

인버트 기능은 그레이 스케일로드 이미지와 잘 작동 (: 나는 반전 기능을 수행 한 후

Mat C(2, 2, CV_64FC2); 

C.at<Vec2d>(0,0)[0] = 1; 
C.at<Vec2d>(0,0)[1] = 1; 
C.at<Vec2d>(0,1)[0] = 3; 
C.at<Vec2d>(0,1)[1] = 4; 
C.at<Vec2d>(1,0)[0] = 2; 
C.at<Vec2d>(1,0)[1] = -1; 
C.at<Vec2d>(1,1)[0] = 5; 
C.at<Vec2d>(1,1)[1] = 2; 

Mat InverseMat; 
invert(C, InverseMat, DECOMP_SVD); 

, 나는이 오류가 계속를 1 채널),하지만 난 진짜와 허수 부분을 포함하는 복잡한 매트릭스에 역수를 할 힘든 시간이 있습니다.

누군가 복잡한 행렬의 역함수를 풀 수있는 방법을 알려주시겠습니까? DECOMP_SVD 방법을 사용하는 것이 바람직합니다. 왜냐하면 단일 채널 이미지로 시도했을 때 DECOMP_LU 또는 DECOMP_CHOLESKY 메서드를 사용하여 원하는 결과를 얻을 수 없기 때문일 수 있습니다. 이는 단수의 행렬 문제 때문일 수 있습니다. 감사.

답변

6

OpenCV는 복잡한 행렬의 반전을 지원하지 않습니다. 복잡한 행렬의 실수 부와 허수 부를 포함하는 실제 행렬을 형성하는 방식으로 복잡한 행렬을 조작해야합니다. This page이 프로세스를 설명합니다. 여기

는 위에서 언급 한 프로세스를 사용하여 복잡한 행렬의 역을 수행하는 코드이다 :

//Perform inverse of complex matrix. 
cv::Mat invComplex(const cv::Mat& m) 
{ 
    //Create matrix with twice the dimensions of original 
    cv::Mat twiceM(m.rows * 2, m.cols * 2, CV_MAKE_TYPE(m.type(), 1)); 

    //Separate real & imaginary parts 
    std::vector<cv::Mat> components; 
    cv::split(m, components); 

    cv::Mat real = components[0], imag = components[1]; 

    //Copy values in quadrants of large matrix 
    real.copyTo(twiceM({ 0, 0, m.cols, m.rows })); //top-left 
    real.copyTo(twiceM({ m.cols, m.rows, m.cols, m.rows })); //bottom-right 
    imag.copyTo(twiceM({ m.cols, 0, m.cols, m.rows })); //top-right 
    cv::Mat(-imag).copyTo(twiceM({ 0, m.rows, m.cols, m.rows })); //bottom-left 

    //Invert the large matrix 
    cv::Mat twiceInverse = twiceM.inv(); 

    cv::Mat inverse(m.cols, m.rows, m.type()); 

    //Copy back real & imaginary parts 
    twiceInverse({ 0, 0, inverse.cols, inverse.rows }).copyTo(real); 
    twiceInverse({ inverse.cols, 0, inverse.cols, inverse.rows }).copyTo(imag); 

    //Merge real & imaginary parts into complex inverse matrix 
    cv::merge(components, inverse); 
    return inverse; 
} 
+0

덕분에 친구를, 당신은 나의 날까지했다. 위의 행렬에 적용됩니다. 나는 이미지로 프로그램을 시도했고 성공적으로 실행되었다. 이미지를 더 자세히 분석해야하므로 다음 단계로 진행할 수 있습니다. 다시 한 번 감사드립니다! – user2223228

관련 문제