not good but great

プログラミング、アート、映画・本の感想について書きます。

openFrameworksを使って、Webカメラの映像に明度による奥行きを演出する

demo


明度によって頂点のZ軸方向の位置を決めています。今回は黒に近いニット帽被っているので、鼻から上の頭がへっこんでいます。これは帽子の明度が小さいからだと思われます。途中で向きが変わるのはドラッグでカメラの位置が変わるからです。
・参考

code

コードを一部抜粋してみます。

//ビデオ
ofVideoGrabber myVideo;

Webカメラを使用するクラスからインスタンスを生成します。

void ofApp::update(){
    //カメラからの映像を更新
    myVideo.update();
    
    //カメラフレーム更新
    if(myVideo.isFrameNew()){
        //ピクセル情報
        unsigned char * pixels = myVideo.getPixels();
        
        for(int i = 0;i < WIDTH;i++){
            for(int j = 0;j < HEIGHT;j++){
                //ピクセルのRGBを取得
                float r = (float)pixels[j * myVideo.width * 3 + i * 3] / 256.0;
                float g = (float)pixels[j * myVideo.width * 3 + i * 3 + 1] / 256.0;
                float b = (float)pixels[j * myVideo.width * 3 + i * 3 + 2] / 256.0;
                
                //明度
                float brightness = (r + g +b) / 3.0f;
                //明度から頂点の位置を算出
                myVerts[j * WIDTH + i] = ofVec3f(i - WIDTH/2,j - HEIGHT/2,brightness * 256.0);
                //頂点の色
                myColor[j * WIDTH + i] = ofFloatColor(r,g,b,0.8);
            }
        }
        
        //VBOの情報を更新
        myVbo.updateVertexData(myVerts, NUM_PARTICLES);
        myVbo.updateColorData(myColor, NUM_PARTICLES);
    }
}

明度から頂点の位置を算出してるところがポイントです。

void ofApp::draw(){
    //カメラ開始
    cam.begin();
    
    ofScale(1,-1,3);
    
    //頂点をドットで表示
    glPointSize(3);
    myVbo.draw(GL_POINTS,0,NUM_PARTICLES);
    cam.end();
    
    //ログ表示
    string info;
    info = "Vertex num = " + ofToString(NUM_PARTICLES,0) + "¥n";
    info += "FPS =" + ofToString(ofGetFrameRate(),2);
    ofDrawBitmapString(info, 30, 30);
}

今回は明度による奥行きを強調するためにZ軸方向を3倍に引き伸ばしました。