2013-02-21 2 views
2

일부 스틸 이미지 처리를하고 있는데, GPUImage는 정말 멋진 프레임 워크입니다 (Brad Larson에게 감사드립니다!).GPUImage : YUV 또는 RGBA가 성능에 영향을 줍니까?

  • 일부 필터는 단 1 구성 요소로 수행 할 수 있습니다

    나는 이해합니다. 이 경우 이미지는 YUV (YCbCr)이어야하고 Y (luma = 이미지 회색조) 만 사용합니다. R, G 및 B.

  • YUV - -
  • 다른 필터는 3 개 성분의 모든 색 정보를 필요> RGB 변환 (GPUVideoCamera에) 제공되어, RGB가 -> YUV가 프래그먼트 쉐이더에 하드 코딩 될 수있다 (예 : : GPUImageChromaKeyFilter)

나는 YUV를 기반으로 할 수있는 이미지 처리 단계와 RGB를 기반으로하는 이미지 처리 단계가 많이 있습니다. 기본적으로 RGB 및 YUV 필터를 혼합하고 싶습니다. 일반적인 질문은 다음과 같습니다.

이러한 연속 전환의 비용/정보 손실은 무엇이며 어떤 디자인을 추천합니까?

감사합니다.

(추신 : 아이폰 4 YUV-> RGB 변환 & AVCaptureStillImageOutput 픽셀 형식의 문제가 무엇인지)

답변

6

GPUImage에서 YUV의 사용은 상당히 새로 추가, 뭔가 아직도 실험하고있다. 필자는 YUV를 사용하여 필터 성능을 향상시키고 메모리 사용을 줄이며 색상 충실도를 향상 시키려고했습니다. 지금까지 나의 수정은이 세 가지 중 하나만 달성했다.

위에서 알 수 있듯이 카메라에서 YUV 프레임을 가져 와서 필터 파이프 라인의 후속 단계에서 처리 할 작업을 결정합니다. 카메라 입력이 목표로하는 모든 필터가 단색 입력 만 원할 경우, 카메라 입력은 파이프 라인을 따라 처리되지 않은 Y 채널 텍스처 만 전송합니다. RGB 입력이 필요한 필터가 있으면 카메라 입력이 YUV-> RGB에서 쉐이더 기반 변환을 수행합니다.

단색을 사용하는 필터의 경우 RGB 변환 단계 (BGRA 데이터를 요청할 때 AV Foundation에서 수행하거나 변환 쉐이더에서 수행)를 제거하고 중복 변환을 수행하면 성능이 크게 향상 될 수 있습니다 RGB를 휘도로 되 돌린다. iPhone 4에서 720p 프레임에서 실행되는 Sobel 엣지 감지 필터의 성능은 RGB 입력이있는 프레임 당 36.0ms에서 직접 Y 채널을 사용하는 15.1ms로 이동합니다. 또한 YUV를 RGB로 변환하고 다시 휘도를 반올림하여 정보가 약간 손실되는 것을 방지합니다. 8 비트 컬러 채널은 동적 범위가 너무 넓습니다.

RGB 입력을 사용하는 경우에도 AV Foundation에서 내 셰이더로이 변환이 이동하면 성능이 향상됩니다. iPhone 4S에서 1080p 입력에 대한 포화 필터를 실행하면 AV Foundation의 내장 BGRA 출력 대신 변환 쉐이더를 사용하여 프레임 당 2.2ms에서 프레임 당 1.5ms로 떨어집니다.

메모리 사용량은 두 가지 RGB 방식간에 거의 동일하므로이를 개선하기위한 방법을 실험하고 있습니다. 모노크롬 입력의 경우 입력의 텍스처 크기가 작기 때문에 메모리 사용량이 크게 감소합니다.

모두 YUV 파이프 라인을 구현하는 것은 Y와 UV 평면에 대한 병렬 렌더링 경로와 셰이더를 유지해야하므로 둘 다 별도의 입력 및 출력 텍스처를 사용하기 때문에 조금 더 어려워집니다.RGB에서 평면 YUV를 추출하는 것은 까다로운 작업입니다. 왜냐하면 OpenGL ES에서 기본적으로 지원되지 않는 입력에서 두 개의 출력을 가져와야하기 때문입니다. 두 번 렌더 패스를해야하는데, 이는 상당히 낭비입니다. 인터리브 된 YUV444는 다단계 파이프 라인의 컬러 포맷으로 더 실용적 일지 모르지만 나는 아직이 문제를 해결하지 못했습니다.

다시 말씀 드리지만, 저는이 문제를 해결하기 시작했습니다.

+1

간단한 테스트를 통해 iPhone 4는 BGRA가 명백한 메모리 사용/대역폭과 달리 420v/420f를 초과하는 성능 저하를 보인 반면 iPhone 3G에서는 yuvs가 mediaserver에서 많은 CPU를 사용했지만 2vuy 및 BGRA 괜찮아. yuvs는 본질적으로 바이트 교환 된 2vuy이기 때문에 BGRA가 변환을하지 않으면 BGRA보다 느려야합니다. 또한 BGRA 프레임에서 감소 된 휘도 대역폭을 찾고 아무 것도 찾지 못했습니다. 하지만 iOS 4.3 이후로 테스트를하지는 않았습니다. –

+0

꽤 완벽한 답변을 주셔서 감사합니다. 실적 수치가 흥미 롭습니다! 디자인에 관해서는 제 경우 정적 인 이미지를 계산하고 다른 색 공간 (HSV, 아마도 CIELab ...)을 사용하고 있습니다. 나는 '원본'이미지 (YUV 또는 RGB)를 보유하고 필요할 때마다이 소스로 돌아갈 수 있다고 생각합니다. 동일한 원본 이미지를 기반으로하는 독립적 인 이미지 조작을 상상해 봅니다. 각각 원본 피드백을 사용하여 원본 그림을 변환합니다. .. 나는 이것이 나의 필요에 맞을 지 아직 보지 못했다.) – Vinzzz

관련 문제