【发布时间】:2012-01-21 02:31:17
【问题描述】:
我愿意:
(1) 将 20x20 IplImage 转换为双精度数组;那么,
(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]);
这不起作用,程序崩溃,我无法确定原因,但让我们猜测它是 seg 错误......此外,必须有一种优雅的方式来做我想做的事,类似于 Matlab 的方式.. .
我什至不知道如何确保数据数组中的数据确实是 我想与码本比较的值(自组织地图分类)......在完美的世界中,这些数据应该是由 cvThreshold 计算的二进制值。
任何帮助将不胜感激!!!!!!
谢谢!!
【问题讨论】:
-
没关系,几个小时后它就可以工作了... IplImage* dest = cvCreateImage(cvSize(20,20), 64, 1); cvConvert(thresReduImg, dest); double* data = (double*)dest->imageData;
标签: c++ matlab image-processing opencv