2012-11-19 2 views
2

GPUImage 프레임 워크의 chromakey 필터를 사용하려고합니다. 필자는 Filtershowcase 예제를 따라 갔지만 분명히 비디오를 보여주기 때문에 그린 스크린에 키잉 효과가 없어서 뭔가 놓쳤다. 뷰 카메라에 들어가는 것보다GPUImage 크로마 키 필터

camera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 
              cameraPosition:AVCaptureDevicePositionBack]; 
camera.outputImageOrientation = UIInterfaceOrientationLandscapeLeft; 
camera.horizontallyMirrorFrontFacingCamera = NO; 
camera.horizontallyMirrorRearFacingCamera = NO; 


chromaKeyFilter = [[GPUImageChromaKeyFilter alloc] init]; 
chromaKeyFilter.thresholdSensitivity = sliderThres.value; 

UIImage *inputImage = [UIImage imageNamed:@"WID-small.jpg"]; 


GPUImagePicture *sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage 
                smoothlyScaleOutput:YES]; 


[camera addTarget:chromaKeyFilter]; 
[sourcePicture addTarget:chromaKeyFilter]; 
[sourcePicture processImage]; 

[chromaKeyFilter addTarget:viewCamera]; 


[camera startCameraCapture]; 

그래서 카메라와 sourcePicture 모두, 필터에 필터를 공급 : 여기에 비디오 카메라/필터의 내 초기화입니다. 하지만 지금은 일반 비디오 만 볼 수 있으며 크로 마키 효과는 없습니다. (임계 값을 변경하는 슬라이더가 있음). 이 필터

camera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; 
camera.outputImageOrientation = UIInterfaceOrientationLandscapeLeft; 
chromaKeyFilter = [[GPUImageChromaKeyBlendFilter alloc] init]; 


UIImage *inputImage; 
inputImage = [UIImage imageNamed:@"WID-small.jpg"]; 
GPUImagePicture *sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; 


[camera addTarget:chromaKeyFilter]; 
[sourcePicture processImage]; 
[sourcePicture addTarget:chromaKeyFilter]; 
[chromaKeyFilter addTarget:viewCamera]; 

[camera startCameraCapture]; 

GPUImageChromaKeyBlendFilter

UPDATED는, 단순히 블랙 아닌 실제 이미지로 대체.

답변

3

Found this gem after a couple of days of trying..... 분명히 당신은 GPUImagePicture (강한 심판)에 매달려 있다고 가정합니다. 필자는 내부적으로 필터 체인이 강력한 참조를 갖게 될 것이라는 인상하에 있었지만 그 경우는 아닙니다. 인스턴스 var로 유지하면 문제가 해결됩니다.

0

슬라이더의 대상과 선택자를 설정 했습니까?

도움이 나를

[(GPUImageChromaKeyFilter *)filter setThresholdSensitivity:[(UISlider *)sender value]]; 
     [image setImage:[filter imageByFilteringImage:sourceImage]]; 

희망을 위해 일했다.

+0

그래,하지만 설정이 임계 값과 아무 관계가 없더라도 어쨌든 내가 기본값으로하지 않았더라도 0.4 – 0xSina

1

GPUImageChromaKeyFilter가 아니라 GPUImageChromaKeyBlendFilter를 원한다고 생각합니다.

블렌드는 두 개의 원본 이미지를 가져와 첫 번째 이미지의 키잉 색과 일치하는 픽셀을 두 번째 이미지의 픽셀로 바꿉니다. 표준 크로마 키잉 필터는 대상 색상과 일치하는 픽셀의 알파 채널을 0.0으로 줄이며 다른 이미지에 블렌딩하지 않습니다.

+0

고마워, 그랬어. 그러나 이제는 녹색이 아닌 이미지가 검은 색으로 바뀝니다. 코드를 업데이트했습니다. 나는 파이프 라인에 뭔가 잘못하고 있다고 생각합니다. – 0xSina

+0

@ 0xSina - WID-small.jpg가 리소스로 응용 프로그램 번들에 제대로 복사되고 있습니까?그렇다면 모든 대상이 추가 된 후에'[sourcePicture processImage];'행을 옮겨보십시오. –

+0

예, NSLog UIImage 및 ''인쇄합니다. 나는 모든 목표 뒤에 그것을 놓으려고했지만 그래도 이미지를 보여주지 않을 것이다. 열쇠가있는 영역을 검정색으로 표시합니다. 그것은 내가 당신이 FilterShowcase에서하고있는 일을 정확하게하고 있기 때문에 이상합니다. 내 프로젝트에서는 아니지만 ... – 0xSina

1

원본 질문과 마찬가지로 사용자 지정보기 계층 구조 상단에 녹색 화면 비디오를 배치하려고합니다. 라이브 비디오. 표준 GPUImage ChromaKey 필터로는 이것이 불가능하다는 것이 나타났습니다. 알파 블렌딩 대신 녹색 픽셀을 배경 픽셀과 혼합합니다. 예를 들어 빨간색 배경이 노란색이되고 파란색이 시안이됩니다.

filterView.backgroundColor=[UIColor clearColor]; 

2) 수정 GPUImageChromaKeyFilter.m

old: gl_FragColor = vec4(textureColor.rgb, textureColor.a * blendValue); 

new: gl_FragColor = vec4(textureColor.rgb * blendValue, 1.0 * blendValue); 
:

1)이 filterview 투명 배경을 가지고 있는지 확인하십시오

이 작업 얻을 수있는 방법은 두 단계를 포함한다

이제 동영상의 모든 키 (예 : 녹색) 픽셀이 투명 해집니다 그리고 무엇이든 filterview 아래에있는 것을 밝히십시오. (라이브) 비디오.

+0

사실, 이것은 비슷한 문제가있는 질문이었습니다 .. http://stackoverflow.com/questions/12462805/chroma-filtering-video-using-gpuimage/16169412#16169412 – Frans

관련 문제