2016-11-09 90 views
0

我正在进行图像识别(标记检测),并正在研究图像下采样预识别以提高性能。推理是我会下载图像,运行检测算法,然后使用下采样因子插入标记坐标。我认为下采样成本是微不足道的,因为它一直由我们的GPU完成。图像下采样性能

所以我尝试使用opencv缩减采样,看到不仅没有得到任何改进,实际上花了更长的时间。然后我认为这是因为我让CPU做它,所以我研究了使用opengl mipmap或甚至着色器进行缩减采样,但从我读过的内容来看,它仍然是一项昂贵的任务,花费数十甚至数百毫秒来减少常见图像决议。

我的问题是,如果下采样是连续进行的明显缓解(想想调整任何图像查看器上的图像或视频游戏中的任何纹理)为什么它使用最常见的方法如此之慢?有一些秘密技术,或者我只是不理解某些东西?

+0

你的纹理有多大?你如何将它们上传到GL API并读回结果?这完全有可能是上传和回读成本是昂贵的部分,而不是缩减本身。 – solidpixel

+0

@solidpixel通常在做1280x720 - > 640x480。使用glTexImage2D从ram加载它,生成mipmap(glGenerateMipmap),然后使用glGetTexImage –

+1

@AlexButera获得第二个mipmap,那么为什么你需要'glGetTexImage'?这是你的方法很慢的确切原因。 AFAIR,您可以始终明确提供所需的mipmap级别,而不必前后移动像素数据并创建新的纹理对象。 – hidefromkgb

回答

0

您可以将图像设置为纹理,并在四边形上使用此纹理。更改纹理坐标,您可以对图像进行任何转换。这是非常快速的方法。这里的瓶颈是将图像从主机复制到设备并返回。

+1

尽管如此,没有纹理过滤功能可以修复任何高于2:1下采样的东西。单次传输中更高的下采样率开始丢弃数据而不是过滤数据。 – solidpixel

+0

这是什么意思?什么是四方?你在谈论opengl吗? –

+0

是的,我的意思是OpenGL。将图像作为纹理上传到GPU内存,将它绑定到四边形并将其绘制到缓冲区,然后将结果复制回来。 –