2012-03-20 5 views
0

私はcv :: Matに格納された画像から共分散行列を取得しようとしています。私はマハラノビスの距離を計算し、色分けを試みる必要があります。マルチチャネル画像と未定義アサーションエラーのcalcCovarMatrix

これは私のコードです:

Mat covar, selection, meanBGR; 
selection = src(roi); 
calcCovarMatrix(selection, covar, meanBGR, CV_COVAR_NORMAL|CV_COVAR_ROWS); 

マットSRCはウェブカメラと標準BGRのOpenCVの形式なので、CV_32FC3からです。ピクセルは、行ベクトルの順序(青、緑、赤)で格納されて(私は思う)..だから私のコードは正しいと思います。しかし、私は、このランタイムエラーをrecive:

Assertion failed (src.channels() == 1) in mulTransposed

私はこのようにあまりにもベクトルを作ってみました:

vector<Scalar> samples; 

for(int i=0; i<selection.rows; i++) { 
    for(int j=0; j<selection.cols; j++) { 

     Scalar pixel = selection.at<Scalar>(i,j); 
     Scalar sample(pixel[0], pixel[1], pixel[2]); 
     samples.push_back(sample); 
    } 
} 

calcCovarMatrix(samples, covar, meanBGR, CV_COVAR_NORMAL|CV_COVAR_ROWS); 

が、私は常に同じエラーを取得します。 manualを読むことは何の考えもしません。

答えて

1

私はあなたに3チャンネルマトリックスを渡すことはできません。これは、出力

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

#include <iostream> 

using namespace cv; 
using namespace std; 

int main(int /*argc*/, char** /*argv*/) 
{ 
    Mat_<float> samples = (Mat_<float>(3, 3) << 1.0, 2.0, 3.0, 
               4.0, 5.0, 6.0, 
               7.0, 8.0, 9.0); 

    Mat cov, mu; 
    cv::calcCovarMatrix(samples, cov, mu, CV_COVAR_NORMAL | CV_COVAR_ROWS); 

    cout << "cov: " << endl; 
    cout << cov << endl; 

    cout << "mu: " << endl; 
    cout << mu << endl; 

    return 0; 
} 

する必要があります:

cov: 
[18, 18, 18; 
    18, 18, 18; 
    18, 18, 18] 
mu: 
[4, 5, 6] 

希望に役立ちます。この小さなサンプルの作業を行います!

+0

ありがとう明確な例ですが、そうですか?どのように皮膚分節化におけるマハラノビス距離の共分散行列を得るか?私は私の以前の質問のこの答えで説明されているメトスを参照しています:http://dsp.stackexchange.com/a/1634/1063 – nkint

0

私は同じ問題を抱えていました。残念ながら、色の共分散を取得する唯一の方法は、手動で行うことです。イメージを分割して結果の行列を1行にし直した場合は、それらを3行1チャネルのマ​​ットに戻して連結します。次に転置で掛け算してサイズ1で割ります。

関連する問題