2012-06-14 63 views
3

我想用反函數和很多函數處理圖像。對於快速運行的代碼,任何人都可以建議3種反演方法中的快速方法?矩陣反演中最快的方法

double cvInvert(const CvArr* src, CvArr* dst, int method=CV_LU) 
  • CV_LU高斯消去具有最佳樞轉元件選擇用於對稱正定義矩陣
  • CV_SVD奇異值分解(SVD)方法
  • CV_SVD_SYM SVD方法。

回答

7

在OpenCV2.x中,有一個名爲Mat::inv(int method)的新接口來計算矩陣的逆。請參閱reference

C++:MatExpr墊:: INV(INT方法= DECOMP_LU)const的

參數: 方法 -

Matrix inversion method. Possible values are the following: 
     DECOMP_LU is the LU decomposition. The matrix must be non-singular. 
     DECOMP_CHOLESKY is the Cholesky LL^T decomposition for symmetrical positively defined matrices only. This type is about twice faster than LU on big matrices. 
     DECOMP_SVD is the SVD decomposition. If the matrix is singular or even non-square, the pseudo inversion is computed. 

我與各個所述方法的試驗中,它顯示DECOMP_CHOLESKY是測試用例中最快的,而LU給出了相似的結果。

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <iostream> 

int main(void) 
{ 
    cv::Mat img1 = cv::imread("2.png"); 
    cv::Mat img2, img3, img; 
    cv::cvtColor(img1, img2, CV_BGR2GRAY); 
    img2.convertTo(img3, CV_32FC1); 
    cv::resize(img3, img, cv::Size(200,200)); 

    double freq = cv::getTickFrequency(); 

    double t1 = 0.0, t2 = 0.0; 
    t1 = (double)cv::getTickCount(); 
    cv::Mat m4 = img.inv(cv::DECOMP_LU); 
    t2 = (cv::getTickCount()-t1)/freq; 
    std::cout << "LU:" << t2 << std::endl; 

    t1 = (double)cv::getTickCount(); 
    cv::Mat m5 = img.inv(cv::DECOMP_SVD); 
    t2 = (cv::getTickCount()-t1)/freq; 
    std::cout << "DECOMP_SVD:" << t2 << std::endl; 

    t1 = (double)cv::getTickCount(); 
    cv::Mat m6 = img.inv(cv::DECOMP_CHOLESKY); 
    t2 = (cv::getTickCount()-t1)/freq; 
    std::cout << "DECOMP_CHOLESKY:" << t2 << std::endl; 

    cv::waitKey(0); 
} 

這裏是正在運行的resutls:

LU:0.000423759

DECOMP_SVD:0.0583525

DECOMP_CHOLESKY:9.3453e-05