多通道图像中的calcCovarMatrix和未解决的断言错误

时间:2012-03-20 21:57:56

标签: c++ opencv covariance

我试图从存储在cv :: Mat中的图像中获取协方差矩阵。我需要它来计算马哈拉诺比斯距离并尝试进行一些颜色分割。

这是我的代码:

Mat covar, selection, meanBGR;
selection = src(roi);
calcCovarMatrix(selection, covar, meanBGR, CV_COVAR_NORMAL|CV_COVAR_ROWS);
Mat src来自网络摄像头和标准的BGR opencv格式,所以CV_32FC3。像素以行向量顺序(蓝色,绿色,红色)存储(我认为)..所以我认为我的代码是正确的。但我记得这个运行时错误:

  

断言失败(src.channels()== 1)在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并没有任何想法。

2 个答案:

答案 0 :(得分:2)

我认为你不能将它传递给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]

希望有所帮助!

答案 1 :(得分:0)

我遇到了同样的问题。不幸的是,我认为获得颜色协方差的唯一方法是手动完成。如果您拆分图像然后将生成的矩阵重新整形为单行,将它们连接在一起(进入3行1通道垫),则可以将其乘以转置并除以大小-1。