c++ - 使用动态分配的数据初始化 cv::Mat

标签 c++ opencv

最近我试图用动态分配的数据初始化一个cv::Mat但失败了。

// Create matrix
size_t sizeA = 30, sizeB = 30;
double** m = new double*[sizeA];

// Fill matrix with data
for(int i = 0; i < sizeA; i++)
{
    m[i] = new double[sizeB];
    for(int j = 0; j < sizeB; j++)
        m[i][j] = (i + 1) * (j + 1);
}

// Compute step between two vectors (not sizeof(double) * sizeB !)
size_t step = reinterpret_cast<size_t>(m[1]) - reinterpret_cast<size_t>(m[0]);

// Copy to matrix (use clone() to see if the data can be addressed properly)
cv::Mat M = cv::Mat(sizeA, sizeB, CV_64FC1, m[0], step).clone();

// delete allocated data
for(int i = 0; i < sizeA; i++)
    delete[] m[i];
delete[] m;

显然,行之间的步长是不一致的(大多数情况下是这样,但有时不是),因为每一行都是独立分配的。 为了表明我只是检查了每一行并检测到几个不一致的步骤:

for(int i = 2; i < sizeA; i++)
{
    if(step != reinterpret_cast<size_t>(m[i]) - reinterpret_cast<size_t>(m[i-1]))
    {
        std::cout << "Inconsistent step detected between element " << i-1 << " and " << i << " : ";
        std::cout << reinterpret_cast<size_t>(m[i]) - reinterpret_cast<size_t>(m[i-1]) << std::endl;
    }
}

我的问题:有没有办法动态分配一个矩阵并将其传递给cv::Mat?

最佳答案

这个怎么样?

double* m = new double[sizeA*sizeB];
size_t step = sizeof(double)*sizeB;

关于c++ - 使用动态分配的数据初始化 cv::Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18233643/

相关文章:

c++ stringstream连接字符串变量与整数和文字字符串

c++ - 是否有一种可扩展的方法可以从 C++ 中的数组初始化结构体?

c++ - OpenCV - 在 cvtColor 之后使用 ROI

c++ - OpenFrameworks,带有 OpenCV,VS2013 设置

c++ - 非递归获取可变参数模板最后类型的通用类型特征?

c++ - 如何Lambda线程体

opencv - 手势识别 OpenCV(用于媒体播放器)

c++ - 如何在没有 Python 调试库的情况下在 Debug模式下使用 Cmake/Visual Studio 构建 OpenCV

java - LBP Cascade (OpenCV) 不会在 android studio 模拟器上加载

c++ - 使用 Dijkstra 或 Bellman–Ford 算法修改的最短路径