C++ OpenCV,IplImage 到双数组

标签 c++ matlab image-processing opencv

我愿意:

(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/

相关文章:

matlab - 如何使用issorted函数检查数组是否按降序排序

python - 根据 bool 图像掩模值选择图像区域

图像处理批处理工具,用于使用 YCbCr=4 :4:4 对图像进行重采样

c++ - 通缉 : Elegant solution to race condition

c++ - 在线程中调用 boost::asio::read() 会阻塞调用线程或进程吗?

c++ - 局部变量的右值引用和 move

c++ - 避免模​​板类重定义错误

rstudio 代码折叠就像在 matlab GUI 中一样

opencv - 将 Mat 传递给 OpenCL 内核会导致段错误

arrays - MATLAB 线向量 + 行向量 = 数组适用于 r2017a 但不适用于 r2016a