Я бы хотел:
(1) преобразовать IplImage размером 20x20 в двойной массив; то
(2) Я бы хотел вычислить ошибку между этим массивом и двумерным массивом 90x (20x20) двойного типа.
В Matlab это легко сделать так:
(1)
I_thresh = I_gray<120;
% transformer matrice en vecteur
data(i*30+j,:) = (reshape(I_thresh',size(I_thresh,1)*size(I_thresh,2),1))';
(2)
function[classeEstim] = som_test(sM,testData,dim,prune)
labelsDbl = cvtCellChar2num(sM.labels);
X = zeros(size(sM.codebook,1),dim);
for i=1:size(testData,1)
for j=1:size(sM.codebook,1)
X(j,:) = abs(testData(1,1:dim) - sM.codebook(j,1:dim));
end
idx = (sum(X,2) == (min(sum(X,2))));
classeEstim = labelsDbl(idx);
end
Это очень просто в Matlab, но в C ++ это ужасно ...
Пока мой код:
double* data;
int step;
CvSize size;
cvGetRawData(thresReduImg, (uchar**)&data, &step, &size);
step /= sizeof(data[0]);
for(int y = 0; y < size.height; y++, data += step )
for(int x = 0; x < size.width; x++ )
data[x] = (double)fabs(data[x]);
//classification
double** X = new double* [HEIGHT];
for (int i = 0; i <= HEIGHT; i++)
X[i] = new double[WIDTH];
for(int i = 0; i <= HEIGHT; i++)
for(int j = 0; j <= WIDTH; j++)
X[i][j] = fabs(data[j] - codebook[i][j]);
Это не работает, программа падает, и я не могу определить причину, но давайте предположим, что это ошибка сегмента ... Кроме того, должен быть элегантный способ сделать то, что я хочу, в стиле Matlab ... .
Я даже не знаю, как убедиться, что данные в массиве данных действительно
значения, которые я хочу сравнить с кодовой книгой (Самоорганизованная классификация карт) ... В идеальном мире эти данные должны быть двоичными значениями, вычисляемыми cvThreshold.
Любая помощь будет очень ценится !!!!!
Спасибо !!