我愿意:
(1) 将一个20x20的IplImage转为double数组;然后,
(2) 我想计算此数组与 90x(20x20) 二维 double 组之间的误差。
在 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 的方式.. .
我什至不知道如何确保数据数组中的数据确实是 我想与密码本(自组织 map 分类)进行比较的值...在一个完美的世界中,这些数据应该是由 cvThreshold 计算的二进制值。
非常感谢任何帮助!!!!
谢谢!!
最佳答案
优雅的方式是
使用OpenCV的C++ API。
然后,您不会将您的图像转换为一个愚蠢且无能为力的数组,而是将您的数组转换为一个强大的 cv::Mat!
然后您将拥有 sum、min 等函数,一切尽在您的掌握!
- 您可以在构造函数中使用 std::vector 初始化 cv::Mat!然后你可以将它重新包装到其他维度。
- 您可以使用 std::copy 从 C 数组初始化 cv::Mat。是的,它有效!
- 您可以像在您的 Matlab 示例中一样使用 abs、operator-()、sum、min、zeros。甚至阈值也以非常相似的方式工作,尽管也有 cv::threshold()
不要犹豫。 今天开始编写优雅干净的代码。
关于C++ OpenCV,IplImage 到双数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8950193/