Nuke Olaf - Log Store

[Android] 안드로이드 - cats-oss/android-gpuimage 카메라 필터 라이브러리 분석 본문

Android

[Android] 안드로이드 - cats-oss/android-gpuimage 카메라 필터 라이브러리 분석

NukeOlaf 2020. 1. 5. 18:23

1. gpuimage 라이브러리 개요

https://github.com/cats-oss/android-gpuimage

 

cats-oss/android-gpuimage

Android filters based on OpenGL (idea from GPUImage for iOS) - cats-oss/android-gpuimage

github.com

 

Goal is to have something as similar to GPUImage as possible. Vertex and fragment shaders are exactly the same. That way it makes it easier to port filters from GPUImage iOS to Android.

GPUImage 가능한 한 가장 비슷하게 만들어내는 것이 목표인 라이브러리라고 기술한다.  Vertex 와 Fragment 는 GPUImage 와 똑같다고 한다. GPUImage iOS에서 Android로 필터를 쉽게 포팅 할 수 있게 하는 것이 목적이라고 한다.

 

2. 그래서, GPUImage 가 무엇인지에 관해 찾아보았다.

https://github.com/BradLarson/GPUImage2

GPUImage 2 is the second generation of the GPUImage framework, an open source project for performing GPU-accelerated image and video processing on Mac, iOS, and now Linux. The original GPUImage framework was written in Objective-C and targeted Mac and iOS, but this latest version is written entirely in Swift and can also target Linux and future platforms that support Swift code.

The objective of the framework is to make it as easy as possible to set up and perform realtime video processing or machine vision against image or video sources. By relying on the GPU to run these operations, performance improvements of 100X or more over CPU-bound code can be realized. This is particularly noticeable in mobile or embedded devices. On an iPhone 4S, this framework can easily process 1080p video at over 60 FPS. On a Raspberry Pi 3, it can perform Sobel edge detection on live 720p video at over 20 FPS.

GPUImage 2는 2 세대 GPUImage 프레임 워크로서 Mac, iOS 및 현재 Linux에서 GPU 가속 이미지 및 비디오 처리를 수행하기 위한 오픈 소스 프로젝트입니다. 원래 GPUImage 프레임 워크는 Objective-C로 작성되었으며 Mac 및 iOS를 대상으로하지만이 최신 버전은 Swift로 완전히 작성되었으며 Swift 코드를 지원하는 Linux 및 향후 플랫폼을 대상으로 할 수도 있습니다.

이 프레임 워크의 목표는 이미지 또는 비디오 소스에 대해 실시간 비디오 처리 또는 머신 비전을 설정하고 수행하기가 쉬워 지도록하는 것입니다. 이러한 작업을 수행하기 위해 GPU에 의존함으로써 CPU 바인딩 코드에 비해 100 배 이상의 성능 향상을 실현할 수 있습니다. 이것은 특히 모바일 또는 임베디드 장치에서 두드러집니다. iPhone 4S에서이 프레임 워크는 60FPS 이상에서 1080p 비디오를 쉽게 처리 할 수 ​​있습니다. Raspberry Pi 3에서는 20FPS 이상의 라이브 720p 비디오에서 Sobel 에지 감지를 수행 할 수 있습니다.

정리하자면, ios 에서 사용하는 이미지 및 비디오 처리에 사용되는 오픈소스 프로젝트라고 한다.

android-gpuimage 가 어떤 기능을 하는지 알아보기 위해서는 ios-gpuimage 가 어떤식으로 사용되는지 어떻게 사용하는지도 공부해야할 것 같다. 그리고,  ios-gpuimage 에서는 지원하는 기능이 android-gpuimage 에서는 지원하지 않을 수도 있으니 이 점에 대해서도 검토해 보아야 한다.

 

3. ios-gpuimage 의 기능 중 android-gpuimage 에서 지원하는 것들

https://github.com/BradLarson/GPUImage2#filtering-live-videohttps://github.com/cats-oss/android-gpuimage#support-status-of-gpuimage-for-ios-shaders

 

4. android-gpuimge 의 sample code

github 에 올라온 gpuimage 의 샘플코드를 보면, 해당 라이브러리를 사용해서 preview를 보기 위해서는 GPUImageView 를 사용해야하는 것으로 보인다. 

app:gpuimage_surface_type="texture_view" 에서

surface type 은 texture_viewsurface_view 둘 중 하나를 선택할 수 있다.

public override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_gallery)

    val imageUri: Uri = ...
    gpuImage = GPUImage(this)
    gpuImage.setGLSurfaceView(findViewById<GLSurfaceView>(R.id.surfaceView))
    gpuImage.setImage(imageUri) // this loads image on the current thread, should be run in a thread
    gpuImage.setFilter(GPUImageSepiaFilter())

    // Later when image should be saved saved:
    gpuImage.saveToPictures("GPUImage", "ImageWithFilter.jpg", null)
}
<jp.co.cyberagent.android.gpuimage.GPUImageView
    android:id="@+id/gpuimageview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:gpuimage_show_loading="false"
    app:gpuimage_surface_type="texture_view" /> <!-- surface_view or texture_view -->

 

4. android-gpuimge 를 이용해 카메라 앱을 구성하려 했으나, 일반 textureView 가 아닌 GLTextureView 를 사용해야 한다는 사실을 알았다.

camera2 api 의 textureView 만 사용할때랑 다른 방법으로 미리보기 뷰를 만들어야 한다.

https://www.charlezz.com/?p=1131

Comments