c - 如何发送大二维数组的 block 以进行处理

标签 c arrays pointers

我有一个使用 int 存储图像数据的二维数组。此时它是 800x640,但可以更改。我想将它传递给 8x8 block 中的另一个函数进行处理。实际上,我可以将数组的一个 8x8 block 复制到一个临时变量中并将其发送到函数,然后将结果复制到另一个 800x640 数组中。

但是,如果我在这个 800x640 数组中给它起始 xy 坐标,我希望该函数能够直接访问 8x8 block (这会更快)。问题是使用 int** 不起作用。声明为 int[8][8] 的参数也不会编译。我该怎么办?现在我正在用 C++ 编写程序,但最终也必须用 C 编写。

最佳答案

您可以将指向原始图像的指针和其他参数提供给函数,并访问函数内 8x8 区域的每个元素。

假设这是您的原始 800x640 图片:

int img[640][800];

声明你的函数为:

void work_on_roi(int* img, size_t img_width, size_t img_height, int roi_x, int roi_y, size_t roi_width, size_t roi_height)

ROI 代表感兴趣区域,是图像处理领域中广泛使用的术语。在您的情况下,如果您想使用 (10,20) 作为其左上角索引访问 roi,您可以使用以下参数调用此函数:

work_on_roi(img, 800, 640, 10, 20, 8, 8)

在这个函数中,访问 roi 中的 (i,j) 元素将是:

(img + (roi_y + j) * img_width)[roi_x + i]

您可以使用 roi_widthroi_height 参数来检查完整性:

// before accessing (i,j) element of roi
assert(i < roi_width);
assert(j < roi_height);
assert(roi_x + i < img_width);
assert(roi_y + j < img_height);

关于c - 如何发送大二维数组的 block 以进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44578569/

相关文章:

c - 将一个int值插入到一个char类型的指针中

c - 生成的 RPC 核心

c - 区分socket上的接收文件

c - 如何在 C 中释放 malloc 的二维数组?

c - 将值填充到指针数组

c++ - codeblocks c++ 停止工作可能是由于引用

c - 如何使用 C 阻止退格键出现在 nCurses 中?

c - 在C中过滤标点符号的最快方法

javascript - 根据数组的键对数组进行分组,并使用组作为索引创建一个新数组

c++ - 如何在 C++ 中打印 const char 指针