'effect'에 해당하는 글 1건

Human Detector!

Pixel Bender 2008. 9. 25. 00:16
레오파드를 발표하는 자리에서 iChat의 시연을 기억하는사람이 있을까.
iChat은 화상대화에 재미있는 효과(effect)를 추가할 수가 있었다.
가령...
배경을 폭포나 롤로코스터 영상으로 바꾼다던지, 아래와같이 홀로그램 스러운 효과를 넣는다던지.
이 영상을 시연하면서 초큼 웃었던 기억이 있는데 내용은 직접 보고 판단하자.

이런식의 효과.

간단한 원리다. 배경을 먼저 찍고 그 이후의 영상에서 배경과 중복되지 않는 부분을 사람이나 기타 다른 움직이는 물체라고 판별하는것.
사실 실제로 그렇게 구현한 것인지는 알 수 없지만 내가 생각하는 가장 간단한 방법은 그거다.
pixel bender로서 플래시에서도 충분히 가능하다. 물론 pixel bender가 아니었어도 가능했지만 gpu로 좀더 원활한 효과가 가능한 것이다.
똑같은 원리로 pixel bender에서 구현해봤다.
참고로 pixel bender에서 플래시용 바이너리로 export하기 위해서는 입력 이미지가 두개여야 하는 등의 제약이 따른다는것을 잊지말자.

이게 배경이라고 설정한 이미지.. 

그리고 사람(답게 생긴 짐승)을 추가해서..
이런 이미지를 넣고 (뻔뻔하게 보정도 없이 그냥 섞었다)

단순하게 같은 좌표의 픽셀값을 비교해서 아래의 결과물을 얻는다.
인물을 제외한 나머지 영역은 투명하기 때문에 또 다른 배경을 삽입해서 합성 할 수도 있고,
미리 저장된 배경을 다시 깔아 넣고 뽑아낸 인물 이미지만 다른 효과를 삽입할 수도 있다.
아래는 소스코드

 <languageVersion : 1.0;>


kernel HumanDetect

<   namespace : "buzzler";

    vendor : "Mobsword Systems";

    version : 1;

    description : "your description";

>

{

    input image4 bg;

    input image4 mix;

    output pixel4 dst;

    const pixel4 mask = pixel4(0.0, 0.0, 0.0, 0.0);


    void

    evaluatePixel()

    {

        float2 coord = outCoord();

        pixel4 pixel_bg = sampleNearest(bg, coord);

        pixel4 pixel_mix = sampleNearest(mix, coord);


        float r = abs(pixel_bg.r - pixel_mix.r);

        float g = abs(pixel_bg.g - pixel_mix.g);

        float b = abs(pixel_bg.b - pixel_mix.b);

        float a = abs(pixel_bg.a - pixel_mix.a);


        if ((r < 0.01)&&(g < 0.01)&&(b < 0.01)&&(a < 0.01))

            dst = mask;

        else

            dst = pixel_mix;

    }

}


 10분만에 대충 짜놓은거라 꼼꼼하게 살펴보진 말고 그냥 보자.
핵심은 굵게 해놓았다. 인물이 없는 배경과, 인물이 있는 이미지에서 각각 pixel4 데이타를 추출(sampling)하고, 두 데이타를 비료해서 큰 차이가 없다면 투명하게 만들고 차이가 좀 난다면 인물이 있는 이미지의 데이타를 출력한다는 의미.

'Pixel Bender' 카테고리의 다른 글

PixelBender Outline View  (0) 2008.11.05
Scketch Shader를 위한 PV3D 튜닝  (0) 2008.10.07
Flex와 Pixel Bender로 iChat 흉내내기  (0) 2008.09.25
Sketch Shader  (0) 2008.09.18
Sobel Operation 의 간단한 응용  (0) 2008.09.18

WRITTEN BY
buzzler

,