2013-01-18 4 views
0

https://github.com/luisespinoza/LEColorPicker 프로젝트 작업, 프로젝트 GPUImage (https://github.com/BradLarson/GPUImage)를 사용하여 임의의 입력 UIImage에서 히스토그램 UIImage를 생성하려고합니다.iOS GPUImage를 사용하여 히스토그램을 생성하는 방법은 무엇입니까?

- (NSDictionary*)dictionaryWithColorsPickedFromImage:(UIImage *)image 
{ 
    GPUImageFilter *filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRGB]; 

    UIImage *filteredImage = [filter imageByFilteringImage:image]; 

    [UIImagePNGRepresentation(filteredImage) writeToFile:@"/Users/Luis/histogram.png" atomically:YES]; 

    return nil; 
} 

문제는 그 histogram.png 모든 입력 이미지에 대한 단순한 검은 선 결과입니다 :

내가 사용하고 현재의 코드는 다음과 같다.

그래서 iOS GPUImage를 사용하여 히스토그램 UIImage를 생성하는 올바른 코드는 어떻게됩니까?

답변

5

FilterShowcase 예제를 보면 실제로 어떻게 작동하는지 확인할 수 있습니다.

GPUImageHistogramFilter는 이미지를 가져 와서 히스토그램을 인코딩하는 256x3 이미지를 출력합니다 (1 픽셀 높이는 프레임 버퍼 구성에서 허용되지 않으므로 3 픽셀입니다). R, G 및 B 값은 해당 이미지의 중심에있는 중앙 1 픽셀 높이의 스트라이프 내에 각각의 색상 채널에 저장됩니다.

시각화하려면 GPUImageHistogramGenerator를 사용하고 GPUImageHistogramFilter의 출력을 피드에 전달해야합니다. GPUImageHistogramGenerator는 이미지로 입력 된 히스토그램의 시각적 표현을 만듭니다. 기본적으로 크기가 설정되어 있지 않으므로 -forceProcessingAtSize:을 사용하여 GPUImageHistogramGenerator의 출력 이미지 크기를 설정해야합니다.

다른주의 사항은 입력 이미지와 GPUImageHistogramFilter 사이에 어떤 종류의 더미 필터가 있어야한다는 것입니다. GPUImageHistogramFilter는 현재 glReadPixels()에 의존하며 렌더링 된 콘텐츠에만 작동하며 이미지 또는 비디오 프레임을 직접 업로드하지 않습니다. 다음

이를 위해 FilterShowcase에 사용되는 코드이다

 filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRGB]; 

     GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; 
     [videoCamera addTarget:gammaFilter]; 
     [gammaFilter addTarget:filter]; 

     GPUImageHistogramGenerator *histogramGraph = [[GPUImageHistogramGenerator alloc] init]; 

     [histogramGraph forceProcessingAtSize:CGSizeMake(256.0, 330.0)]; 
     [filter addTarget:histogramGraph]; 

     GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; 
     blendFilter.mix = 0.75;    
     [blendFilter forceProcessingAtSize:CGSizeMake(256.0, 330.0)]; 

     [videoCamera addTarget:blendFilter]; 
     [histogramGraph addTarget:blendFilter]; 

     [blendFilter addTarget:filterView]; 

이 들어오는 카메라 영상의 상단에 생성 된 히스토그램 시각화 오버레이.

+0

오버레이로 UIImage 또는 GPUImage에 적용하는 방법 – ShivaPrasad

+0

사이에 감마 필터가있는 이유는 무엇입니까? –

+0

@DeepakSharma - 카메라 데이터에 더미 필터가 필요하므로 glReadPixels()에서 값을 가져옵니다. 그것은 해킹입니다. 그리고 어느 시점에서 저는이 문제를 좀 더 영구적으로 해결할 생각 이었지만 아직 해결하지 못했습니다. –

관련 문제