"iPhone의 카메라에서 입력을 실시간으로 처리하기위한"구현을 매우 간단하게 만드는 ofVideoGrabber

iPhone의 카메라로부터의 입력을 실시간으로 취득해, 어떠한 화상 처리를 실시하는, 즉 iOS어플리로 동영상 처리를 실시하는 것은, 꽤 귀찮습니다.

아래 기사를 보면 알 수 있지만,

셔터 소리가 나지 않는 카메라 앱을 구현하는 방법 - Over&Out

AVFoundation을 사용하여 카메라로부터의 입력을 매 프레임 얻으려고 하는 것만으로 상당히 하는 경우가 많습니다. 델리게이트 메소드에 건네져 오는 화상 데이터가 CMSampleBufferRef 라고 하는 형태로 건너 오는 것도 (개인적으로는) 허들을 느끼는 부분으로, 매회 「어떻게 취급하는 거야?」라고 구구해 버립니다.

또한 매 프레임 전송되는 이미지 정보를 실시간으로 처리하려고 하면 역시 OpenGL 기반으로 처리해야 할 필요가 나오고, 이것 또한 (개인적으로는) 신경이 쓰이는 곳입니다.

그런데 videoGrabberExample이라는 openFrameworks와 함께 제공되는 샘플 소스를 보면 실제로 간단한 구현으로 카메라의 입력 실시간 처리가 실현되었습니다.

openFrameworks for iOS 샘플 목록 - Qiita [키타]

이건 편리한 것 같다는 것으로, 그 사용법과, 칠러와 소스를 들여다 본 내용을 아래에 정리합니다.

구현



이런 식으로, 카메라로부터의 입력에 대해서 리얼타임에 반전 처리를 걸어, 좌하에 표시하기 위한 실장 순서입니다. (기본적으로는 videoGrabberExample 의 코드를 간단하게 해 주석 붙인 것뿐입니다)



설정



멤버 변수에
ofVideoGrabber grabber;
ofTexture tex;
unsigned char * pix;

정의,
void testApp::setup(){

    // ofVideoGrabberを初期化
    grabber.initGrabber(480, 360, OF_PIXELS_BGRA);

    // テクスチャをallocate
    tex.allocate(grabber.getWidth(), grabber.getHeight(), GL_RGB);

    // バッファ確保
    pix = new unsigned char[ (int)( grabber.getWidth() * grabber.getHeight() * 3.0) ];
}

카메라에서 입력을 얻고 이미지 처리


void testApp::update(){

    // カメラからの入力を取得
    grabber.update();
    unsigned char * src = grabber.getPixels();

    // 画素数 x チャンネル数
    int totalPix = grabber.getWidth() * grabber.getHeight() * 3;

    // 反転処理
    for(int k = 0; k < totalPix; k+= 3){
        pix[k  ] = 255 - src[k];
        pix[k+1] = 255 - src[k+1];
        pix[k+2] = 255 - src[k+2];        
    }

    // テクスチャデータ生成
    tex.loadData(pix, grabber.getWidth(), grabber.getHeight(), GL_RGB);
}

상기 코드에서는 프레임마다의 입력을 취득해, 거기에 각 화소치를 반전시키는 처리를 실시하고 있습니다.

그리기


void testApp::draw(){    

    // カメラからの入力を描画    
    grabber.draw(0, 0);

    // 生成したテクスチャを描画
    tex.draw(0, 0, tex.getWidth() / 4, tex.getHeight() / 4);
}

소스의 내용을 들여다 본다



요 전날 쓴 이 기사 에서 일부 oF 클래스에 단순한 래퍼 의혹을 품은 것입니다만, 이것은 그 반대로 매우 편리하기 때문에, 어떤 느낌에 랩 되고 있는지 소스의 내용을 봐 보았습니다.

AVFoundationVideoGrabber



소스는 addons/ofxiOS/src/video/AVFoundation 에 있습니다만, AVFoundation 주위의 여러분은 이 AVFoundationVideoGrabber 라고 하는 클래스로 랩 되고 있었습니다.

ofxiOSVideoGrabber



이 클래스의 소스는 addons/ofxiOS/src/video 에 있습니다.

위의 AVFoundationVideoGrabber에 대한 포인터가 있습니다. ofBaseVideoGrabber를 상속하고 재정의하는 각 메서드의 내용은 AVFoundationVideoGrabber 메서드를 호출합니다.

ofVideoGrabber



소스의 위치는 libs/openFrameworks/video
iOS 환경의 경우 ofxiOSVideoGrabber를 인스턴스로 갖도록 구현되었습니다.
#ifdef OF_VIDEO_CAPTURE_IOS
    #include "ofxiOSVideoGrabber.h"
    #define OF_VID_GRABBER_TYPE ofxiOSVideoGrabber
#endif
if( grabber == NULL ){
    setGrabber( ofPtr<OF_VID_GRABBER_TYPE>(new OF_VID_GRABBER_TYPE) );
}

AVFoundation 이외의 여러 가지(OpenGL의 텍스처로서의 그리기라든지)는 여기에 구현되고 있습니다.

어떠한 조사



iOS 앱에서 OpenGL에서 이미지/동영상 처리를 하는 경우, GPUImage 를 이용하는 경우가 많기 때문에, 그것과 병용하려면 어떻게 하는 것이 좋은가(뭔가의 공통 포맷으로 하면 좋다고 생각하기 때문에, 그것을, 어느 타이밍에서, 어떤 포맷으로 하는 것이 좋은가)라고 하는 것을 어느쪽이나 조사하려고 합니다.

좋은 웹페이지 즐겨찾기