2013-03-29 44 views
6

Tôi gặp khó khăn khi làm nghịch đảo của một ma trận phức tạp. Theo tôi biết, ma trận phức tạp đơn giản là ma trận hai kênh (CV_32FC2/CV_64FC2).Làm thế nào để làm nghịch đảo trên ma trận phức tạp trong OpenCV?

Hãy nói rằng tôi có một ma trận C:

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); 

Sau khi tôi thực hiện chức năng nghịch, tôi tiếp tục nhận được lỗi này:

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

Chức năng nghịch hoạt động tốt với một hình ảnh màu xám nạp (1 kênh), nhưng tôi có thời gian khó để làm nghịch đảo trên ma trận phức tạp có chứa phần thực và ảo.

Ai đó có thể vui lòng cho tôi biết cách giải quyết vấn đề nghịch đảo của ma trận phức tạp không? Tốt hơn là sử dụng phương pháp DECOMP_SVD, vì tôi không thể có được kết quả mong muốn bằng phương pháp DECOMP_LU hoặc DECOMP_CHOLESKY khi tôi thử với một hình ảnh kênh đơn lẻ, có lẽ do vấn đề ma trận số ít. Cảm ơn.

Trả lời

6

OpenCV không hỗ trợ đảo ngược các ma trận phức tạp. Bạn phải thao tác ma trận phức tạp theo cách tạo thành một ma trận thực có chứa các phần thực và ảo của ma trận phức tạp. This page giải thích quy trình.

Đây là đoạn mã để thực hiện nghịch đảo của một ma trận phức tạp bằng cách sử dụng quá trình nêu trên:

//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

Thanks buddy, bạn đã thực hiện lên ngày của tôi. Nó hoạt động cho ma trận ở trên. Tôi đã thử chương trình với hình ảnh và nó cũng chạy thành công. Tôi sẽ cần tiếp tục phân tích hình ảnh và bây giờ tôi có thể tiếp tục với bước xử lý tiếp theo của mình. Cảm ơn một lần nữa! – user2223228

Các vấn đề liên quan