calcCovarMatrix в многоканальном изображении и неразрешенная ошибка утверждения - PullRequest
1 голос
/ 21 марта 2012

Я пытаюсь получить ковариационную матрицу из изображения, хранящегося в cv :: Mat.мне это нужно для вычисления расстояния махаланобисов и попытки некоторой цветовой сегментации.

это мой код:

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

Источник Mat от веб-камеры и стандартного формата 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);

но я всегда получаю одну и ту же ошибку.чтение руководства не дает никаких идей.

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Я не думаю, что вы можете передать это 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 голосов
/ 03 марта 2016

У меня была такая же проблема.К сожалению, я думаю, что единственный способ получить цветовую дисперсию - это сделать это вручную.Если вы разделите изображение, а затем измените полученные матрицы на отдельные строки, объедините их обратно (в 3-рядную 1-канальную дорожку), а затем просто умножьте на транспонирование и разделите на размер - 1.

...