【发布时间】:2017-03-23 10:56:46
【问题描述】:
我正在研究图像识别(标记检测),并正在研究图像降采样预识别以提高性能。推理是我将对图像进行下采样,在其上运行检测算法,然后使用下采样因子插入标记坐标。我认为下采样成本将是微不足道的,因为它一直由我们的 gpu 完成。
所以我尝试使用 opencv 进行下采样,发现不仅没有得到任何改进,而且实际上花了更长的时间。然后我认为这是因为我正在让 cpu 做到这一点,所以我研究了使用 opengl mipmap 甚至着色器进行下采样,但从我所读到的内容来看,它仍然是一项代价高昂的任务,需要数十甚至数百毫秒才能将普通图像减半决议。
我的问题是,如果连续进行下采样很容易(想想在任何图像查看器上调整图像大小或在视频游戏中调整任何纹理),为什么使用最常见的方法会如此缓慢?是有什么秘诀还是我没看懂?
【问题讨论】:
-
你的纹理有多大?您如何将它们上传到 GL API 并读回结果?完全有可能是上传和回读成本是昂贵的部分,而不是下采样本身。
-
@solidpixel 通常做 1280x720 -> 640x480。使用 glTexImage2D 从 ram 加载它,生成 mipmaps(glGenerateMipmap),然后使用 glGetTexImage 获取第二个 mipmap
-
@AlexButera 那么为什么需要
glGetTexImage?这就是您的方法缓慢的确切原因。 AFAIR,您始终可以显式提供所需的 mipmap 级别,而无需来回移动像素数据并创建新的纹理对象。 -
您使用的是桌面 OpenGL 还是 OpenGL ES?
-
@NicolBolas ES 1.1
标签: algorithm opencv image-processing opengl-es opengl-es-1.1