c++ - 如何在 OpenCV Mat 中保留固定的缓冲区大小?

标签 c++ opencv memory-management mat

我正在重写一些遗留代码,这些代码使用原始 C 样式数组对 double 进行矩阵运算。由于代码已经在其他地方依赖于 OpenCV,因此我想改用 cv::Mat 类。

困扰我的特定代码适用于大小从 1*1 到 NN 的方阵。它通过分配 NN 个缓冲区并将其中的一个子集用于较小的矩阵来实现。

double* buf = new double[NxN];
for (int i = 1; i < N; ++i) {
    // Reuse buf to create a i*i matrix and perform matrix operations
    ...

}
delete[] buf;

基本上,我想替换该代码以在循环中使用 cv::Mat 对象。问题是,代码需要大量的循环迭代(有嵌套循环等),如果我只使用简单和干净的方法,就会有太多的分配/释放。因此,我想预先保留我的矩阵对象的大小,并在每次迭代时调整它的大小。理想情况下,它看起来像这样:

cv::Mat m;
m.reserveBuffer(N * N * sizeof(double));
for (int i = 1; i < N; ++i) {
    m = cv::Mat(i, i, CV_64F);
    // Perform matrix operations on m
    ...

}

但据我所知,这只会删除 m 的前一个实例,然后分配一个 i*i 矩阵。正确的方法是什么?

最佳答案

您可以使用 cv::Mat::operator() 为您的缓冲区创建子矩阵 header .为您要在当前循环迭代中处理的 ROI 传递 cv::Rect(在您的情况下为 {0, 0, i, i}),它将返回一个 View 您的缓冲区作为另一个 cv::Mat 实例。它不会分配新缓冲区,而是引用原始缓冲区数据。

cv::Mat m(N, N, CV_64FC1);
for (int i = 1; i < N; ++i) {
    cv::Mat subM = m({0, 0, i*i});
    // Perform matrix operations on "subM"
    // Modifying "subM" will modify "m" buffer region that "subM" represents
}

请注意 subM 不会 be continious ,因此如果您进行任何原始缓冲区处理,则需要逐行处理它。

关于c++ - 如何在 OpenCV Mat 中保留固定的缓冲区大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56589426/

相关文章:

c++ - 删除复制构造函数是否也会删除默认的复制/移动运算符?

c++ - 使用 KDS 中断 KL25Z 板

java - 使用 onDestroy() 优化 Android 应用程序中的内存

c++ - 结构的 cudaMalloc 和相同结构的元素

c++ - 隐式特化模板类而不使用 <>

c++ - OpenCV cv::Mat 导致潜在的内存泄漏与 std::vector

python - 手动实现bayern转RGB

ios - 将 opencv2.framework 链接到 Swift Xcode 项目时出错

C 编程 : Received data is written to a pointer

c++ - 以抽象类作为声明 C++ 的基于范围的 for 循环