我正在重写一些遗留代码,这些代码使用原始 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/