我有这样的代码:
Mat src;
Mat dst;
Mat mean;
uchar tab[768];
for(i = 0; i< size.height; i++) {
const uchar* sdata = src.ptr(i);
const uchar* mdata = mean.ptr(i);
uchar* ddata = dst.ptr(i);
for(j = 0; j < size.width; j++) {
ddata[j] = tab[sdata[j] - mdata[j] + 255];
}
}基本上,我试图计算选项卡的idx值,使用该idx获取选项卡中的值,然后将其分配给ddata。
是否有更有效的方法来取得同样的结果?
发布于 2021-12-27 11:18:48
您可以利用以下事实:2维矩阵在内存中是一维的:
Mat src;
Mat dst;
Mat mean;
uchar tab[768];
const int maxI = size.width * size.height;
for(i = 0; i< maxI; i++) {
dst.ptr(i) = tab[src.ptr(i) - mean.ptr(i) + 255];
}在此基础上,您可以使用指针来避免从每个循环的索引中重新计算数据位置:
Mat src;
Mat dst;
Mat mean;
uchar tab[768];
const uchar* sdata = src.ptr(0);
const uchar* mdata = mean.ptr(0);
uchar* ddata = dst.ptr(0);
const int maxI = size.width * size.height;
for(i = 0; i< maxI; ++i) {
*ddata++ = tab[*sdata++ - *mdata++ + 255];
}注意:在第二个例子中,我将循环中的i++更改为++i,理论上这可能会更快,不过您应该在那里进行测量,看看这是否真的改变了什么。
而且,这段代码没有利用并行性。通过使用多线程使其运行得更快,您可以利用多个核心。这是另一个主题,如果您想走这条路线,这个this question有一些您可能会感兴趣的答案。
https://stackoverflow.com/questions/70494632
复制相似问题