使用安卓相机创建绿幕效果的第一步

5
我想使用Android相机创建一个色度键效果。我不需要一步一步的指导,但我想知道劫持Android相机并应用滤镜的最佳方法。我查看了API,但没有找到关于如何操纵来自相机的数据的确切信息。起初,我尝试使用SurfaceTexture,但我不完全了解它如何帮助或如何使用它。然后我尝试使用GLSurfaceView,这可能是正确的方向,但我不太确定。

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

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

任何帮助都将不胜感激。也非常感谢提供示例的链接。

谢谢。


1
https://dev59.com/-VXTa4cB1Zd3GeqP6v7h - fneron
您需要我回答中提供更多细节吗? - Jaa-c
@Jaa-c 不好意思。批准晚了,直到今天才发现我的问题有答案。非常感谢! - Kyle
3个回答

6
唯一的真正机会是使用openGL ES和片段着色器(至少需要openGL ES 2.0),在GPU上实现色度键效果。着色器本身将非常简单(Google即可)。但要做到这一点,您需要使用回调显示相机预览。您将不得不实现Camera.PreviewCallback,为图像数据创建缓冲区并使用setPreviewCallbackWithBuffer方法。您可以从我对类似问题的答案中获得基本思路。请注意,此自定义相机预览的性能存在显着问题,但它可能适用于支持ES 2.0的硬件。
为了使用OpenGL显示预览,您需要扩展GLSurfaceView并实现GLSurfaceView.Renderer。然后,您将使用glTexImage2D将相机预览帧绑定为纹理到某个简单的矩形,其余部分将由着色器处理。查看如何在ES中使用着色器这里或如果您没有使用着色器的经验,此教程可能是一个很好的开始。
至于另一个问题:您可以从预览中保存当前图像,但是预览的分辨率低于拍摄的照片,因此您可能希望单独拍摄照片,然后进行处理(您可以为它使用相同的着色器)。
关于C++,它需要大量的额外工作,但是输出效果值得怀疑。但如果正确使用,它可以提高性能。尝试查看这个文章,它与类似主题相关,描述了如何使用NDK处理相机预览并在openGL中显示它。但是,如果您想在C++中执行色度键效果,则比着色器慢得多。

原始的“教程”链接已经失效。经过一番搜索,我在这里找到了另一个版本:https://pixelp3.wordpress.com/2011/03/13/shaders-android/。 - gMale
@Jaa-c 我最终选择了OpenGL这条路。不过我做了一些不同的事情。你不需要有一个像素缓冲区。Android允许你使用setPreviewTexture将相机像素推送到OES纹理中。 - Kyle

2

2
在Google Code上有一个Chroma-Key项目:http://code.google.com/p/chroma-key-project/。它包括一种上传使用chroma-key技术的图片的方法:
经过全面的在线搜索,我未能找到任何适用于Android设备的开源项目与Chroma-keying相关联。该项目旨在提供一个有用的Chroma-key库,使得实现可以在绿屏或蓝屏前拍照并将图片应用于所选背景的应用程序和游戏变得更加容易。此外,该应用程序还将允许用户使用Intent上传图片。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接