5

我想使用 android 相机创建一个色度键效果。我不需要一步一步,但我想知道劫持android相机并应用过滤器的最佳方法。我检查了 API 并没有发现任何关于如何操作来自相机的数据的超级权威。起初我考虑使用表面纹理,但我不完全了解它如何帮助或如何使用它。然后我使用 GLSurfaceView 进行了检查,这可能是正确的方向,但不太确定。

另外,为了补充我的问题,我将如何处理图像的预览和保存?我会至少处理图像两次吗?预览时一次,保存时一次?我认为这可能是最好的解决方案。

最后,创建一个 C/++ 包装器来处理处理以优化速度是否有意义?

任何帮助都将不胜感激。一些示例的链接也将不胜感激。

谢谢。

4

3 回答 3

6

唯一真正的机会是使用 openGL ES 和片段着色器(至少需要 openGL ES 2.0)并在 GPU 上执行色度键效果。着色器本身将非常简单(谷歌)。

但要做到这一点,您需要显示带有回调的相机预览。您将必须实现Camera.PreviewCallback、为图像数据创建缓冲区并使用setPreviewCallbackWithBuffer方法。你可以从我对类似问题的回答中得到基本的想法。请注意,此自定义相机预览的性能存在重大问题,但它可能适用于支持 ES 2.0 的硬件。

要使用 openGL 显示预览,您需要扩展GLSurfaceView并实现GLSurfaceView.Renderer. 然后,您将相机预览帧作为纹理绑定glTexImage2D到一些简单的矩形,其余部分将由着色器处理。在这里查看如何在 ES 中使用着色器,或者如果您没有使用着色器的经验,本教程可能是一个好的开始。

对于另一个问题:您可以从预览中保存当前图像,但预览的分辨率低于拍摄的照片,因此您可能想要拍摄一张照片然后单独处理它(您可以使用相同的着色器) .

至于 C++,需要付出很多额外的努力才能得到有问题的输出。但如果做得好,它可以提高性能。尝试查看这篇文章,它是一个类似的主题,它描述了如何使用 NDK 处理相机预览并在 openGL 中显示。但是如果你想在 C++ 中做色度键效果,它会比着色器慢得多。

于 2013-04-16T00:02:21.597 回答
2

你可以查看这个库:https ://github.com/cyberagent/android-gpuimage 。它提供了一个框架来使用 GL 着色器在设备的 GPU 上进行图像处理。还有一个示例展示了如何将库与相机一起使用。

于 2013-04-15T23:26:30.063 回答
2

Google-Code 上有一个 Chroma-Key-Project:http ://code.google.com/p/chroma-key-project/它包括一种使用 chroma-key 上传作为令牌的图片的方法:

在网上进行了详尽的搜索后,我没有找到任何使用 Android 设备的 Chroma-keying 的开源项目。该项目的目的是提供一个有用的>色度键库,这将使实现可以在绿色或蓝色屏幕前拍摄>图片并将图片应用到选定背景上的应用程序和游戏变得容易。>此外,该应用程序还将允许用户使用 Intent 上传图片。

于 2013-04-18T11:24:47.267 回答