gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:38:00 30 4
gpt4 key购买 nike

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com