2017-08-29 44 views
1

我計算柯閥和使用CV方法cv__calcCovarMatrixcv :: calcCovarMatrix如何工作?

第一種方法

cv::Mat_<uchar> samples(2,9); samples << 1,3,2,5,8,7,12,2,4,8,6,9,4,3,3,2,7,7; 
cv::Mat_<float> covar, mean; 
std::cout << "\nsamples\n" << samples; 
cv::calcCovarMatrix(samples, covar, mean, cv::COVAR_NORMAL|cv::COVAR_COLS|cv::COVAR_SCALE, CV_32FC1); 
std::cout << "\nMean\n" << mean << "\nCovar\n" << covar << std::endl; 

方法二

cv::Mat_<uchar> x_sample(1,9); x_sample << 1,3,2,5,8,7,12,2,4; 
cv::Mat_<uchar> y_sample(1,9); y_sample << 8,6,9,4,3,3,2,7,7; 
std::vector<cv::Mat> matPtr; 
matPtr.push_back(x_sample); 
matPtr.push_back(y_sample); 
cv::calcCovarMatrix(&matPtr, 9, covar, mean, cv::COVAR_NORMAL, CV_32FC1); 
std::cout << "\nMean\n" << mean << "\nCovar\n" << covar << std::endl; 
  1. 我期待獲得-8.07的協方差和平均的意思x樣本和y樣本的x = 4.89和y = 5.44。

但答案是-7.17,除以樣本數量而不是樣本-1。爲什麼?

樣品

[ 1, 3, 2, 5, 8, 7, 12, 2, 4; 
    8, 6, 9, 4, 3, 3, 2, 7, 7] 

平均

[4.8888888; 
5.4444447] 

COVAR(我使用CV_COVAR_SCALE),但是協方差是由樣品1和樣品不正常劃分。

[11.209877, -7.1728396; 
-7.1728396, 5.5802469] 
  • 我無法編譯第二方法。 Ofcourse cv :: Mat *與std :: vector *不兼容,但是我應該如何將指針傳遞給包含兩個矩陣的數組。
  • +1

    您需要將'x'和'y'點存儲爲行和列。操作正在通過列 - 平均1和8是4.5,平均3和6是4.5,2和9是5.5等。 –

    +0

    @亞歷山大雷諾茲:謝謝你的提示..我犯了一個錯誤..它應該是cv :: COVAR_COLS而不是cv :: COVAR_ROWS。但是,我仍然無法獲得協變。我將編輯該問題。 – infoclogged

    回答

    1

    只需使用CV_COVAR_NORMAL沒有CV_COVAR_SCALE標誌和自己縮放它們:

    Mat covar, mean; 
    cv::calcCovarMatrix(samples, covar, mean, cv::CV_COVAR_NORMAL | CV_COVAR_COLS); 
    covar = covar/(samples.cols - 1); 
    

    對於點二,請注意,有爲calcCovarMatrix()有效來電。從docs

    void calcCovarMatrix(const Mat* samples, int nsamples, Mat& covar, Mat& mean, int flags, int ctype=CV_64F) 
    void calcCovarMatrix(InputArray samples, OutputArray covar, InputOutputArray mean, int flags, int ctype=CV_64F) 
    

    在OpenCV中,所述InputArray類型是用於事情是矩陣狀的通用分類器。它可能會也可能不會接受你的向量,但是你在代碼中使用了第一個第一個的調用,它需要一個Mat。 A std::vector不是Mat,所以這就是它不能編譯的原因。嘗試第二個電話。

    +0

    不合作通常已經包含縮放嗎?爲什麼要單獨完成它?你還可以看看第二點嗎? – infoclogged

    +0

    僅當您使用'CV_COVAR_SCALE'時,因爲有時候您可能需要擴展自己。從[文檔](http://docs.opencv.org/3.0-beta/modules/core/doc/operations_on_arrays.html#calccovarmatrix)「默認情況下(如果未指定標誌),協方差矩陣不會被縮放(比例= 1)「。 –

    +0

    @infoclogged我編輯了一點關於你的要點#2。我通常不用C++編寫OpenCV代碼,所以這是一個猜測,但試試看,並讓我知道。 –