2016-08-15 5 views
5

में कनवर्ट करें मैंने दोहरी फिशिए वीडियो (रिचोह थेटा एस कैमरा से प्राप्त) को समेकित प्रारूप (आईओएस एप्लिकेशन के लिए) में परिवर्तित करने के लिए खुले ढांचे का उपयोग किया।दोहरी फिशिए वीडियो को इक्वायरैंगुलर

दोहरी फ़िशआई चित्र नमूना: enter image description here

equirectangular छवि नमूना:

equirectangular.frag

// based on ThetaShaderPack_20150926 (http://stereoarts.jp/) written by Nora. 
#ifdef GL_ES 
// define default precision for float, vec, mat. 
precision highp float; 
#endif 

#define PI 3.14159265358979 
#define _THETA_S_Y_SCALE (640.0/720.0) 

uniform sampler2D mainTex; 
uniform float radius; 
uniform vec4 uvOffset; 

varying vec2 texCoordVarying; 

void main (void) { 
    vec2 revUV = texCoordVarying.st; 
    if (texCoordVarying.x <= 0.5) { 
     revUV.x = revUV.x * 2.0; 
    } else { 
     revUV.x = (revUV.x - 0.5) * 2.0; 
    } 

    revUV *= PI; 

    vec3 p = vec3(cos(revUV.x), cos(revUV.y), sin(revUV.x)); 
    p.xz *= sqrt(1.0 - p.y * p.y); 

    float r = 1.0 - asin(p.z)/(PI/2.0); 
    vec2 st = vec2(p.y, p.x); 

    st *= r/sqrt(1.0 - p.z * p.z); 
    st *= radius; 
    st += 0.5; 

    if (texCoordVarying.x <= 0.5) { 
     st.x *= 0.5; 
     st.x += 0.5; 
     st.y = 1.0 - st.y; 
     st.xy += uvOffset.wz; 
    } else { 
     st.x = 1.0 - st.x; 
     st.x *= 0.5; 
     st.xy += uvOffset.yx; 
    } 

    st.y = st.y * _THETA_S_Y_SCALE; 

    gl_FragColor = texture2D(mainTex, st); 
} 

equirectanguler.vert

: enter image description here

मैं शेडर नीचे का उपयोग

uniform mat4 projectionMatrix; 
uniform mat4 modelViewMatrix; 
uniform mat4 textureMatrix; 
uniform mat4 modelViewProjectionMatrix; 

attribute vec4 position; 
attribute vec4 color; 
attribute vec3 normal; 
attribute vec2 texcoord; 

varying vec2 texCoordVarying; 

void main() { 
    texCoordVarying = texcoord; 
    gl_Position = modelViewProjectionMatrix * position; 
} 
नीचे कोड के साथ

: main.mm

#include "ofApp.h" 

int main() { 

    // here are the most commonly used iOS window settings. 
    //------------------------------------------------------ 
    ofiOSWindowSettings settings; 
    settings.enableRetina = false; // enables retina resolution if the device supports it. 
    settings.enableDepth = false; // enables depth buffer for 3d drawing. 
    settings.enableAntiAliasing = false; // enables anti-aliasing which smooths out graphics on the screen. 
    settings.numOfAntiAliasingSamples = 0; // number of samples used for anti-aliasing. 
    settings.enableHardwareOrientation = false; // enables native view orientation. 
    settings.enableHardwareOrientationAnimation = false; // enables native orientation changes to be animated. 
    settings.glesVersion = OFXIOS_RENDERER_ES2; // type of renderer to use, ES1, ES2, ES3 
    settings.windowMode = OF_FULLSCREEN; 
    ofCreateWindow(settings); 

    return ofRunApp(new ofApp); 
} 

``` 

`offApp.mm` 

``` 
#include "ofApp.h" 

//-------------------------------------------------------------- 
void ofApp::setup(){  
    ofDisableArbTex(); 

    devices = theta.listDevices(); 
    bool isDeviceConnected = false; 
    for(int i = 0; i < devices.size(); i++){ 
     if(devices[i].deviceName == "RICOH THETA S"){ 
      theta.setDeviceID(devices[i].id); 
      isDeviceConnected = true; 
     } 
    } 
    if(!isDeviceConnected){ 
     ofLog(OF_LOG_ERROR, "RICOH THETA S is not found."); 
    } 
    theta.initGrabber(360, 568); 

    shader.load("shaders/equirectanguler"); 

    fbo.allocate(320, 568); 

    sphere = ofSpherePrimitive(568, 64).getMesh(); 
    for(int i=0;i<sphere.getNumTexCoords();i++){ 
     sphere.setTexCoord(i, ofVec2f(1.0) - sphere.getTexCoord(i)); 
    } 
    for(int i=0;i<sphere.getNumNormals();i++){ 
     sphere.setNormal(i, sphere.getNormal(i) * ofVec3f(-1)); 
    } 

    offset.set("uvOffset", ofVec4f(0,0.0,0,0.0), ofVec4f(-0.1), ofVec4f(0.1)); 
    radius.set("radius", 0.445, 0.0, 1.0); 
    showSphere.set("showSphere", false); 
    thetaParams.add(offset); 
    thetaParams.add(radius); 
    gui.setup(thetaParams); 
    gui.add(showSphere); 

    cam.setAutoDistance(false); 
    cam.setDistance(0); 
} 

//-------------------------------------------------------------- 
void ofApp::update(){ 
    theta.update(); 
} 

//-------------------------------------------------------------- 
void ofApp::draw(){ 
    if(theta.isFrameNew()){ 

     fbo.begin(); 
     ofClear(0); 
     shader.begin(); 
     shader.setUniformTexture("mainTex", theta.getTexture(), 0); 
     shader.setUniforms(thetaParams); 
     theta.draw(0, 0, 320, 568); 
     shader.end(); 
     fbo.end(); 

    } 

    if(!showSphere){ 

     fbo.draw(0, 0, 320, 568); 

    }else{ 

     ofEnableDepthTest(); 
     cam.begin(); 
     fbo.getTexture().bind(); 
     sphere.draw(); 
     fbo.getTexture().unbind(); 
     cam.end(); 

    } 

    ofDisableDepthTest(); 
    gui.draw(); 
} 

//-------------------------------------------------------------- 
void ofApp::exit(){ 

} 

//-------------------------------------------------------------- 
void ofApp::touchDown(ofTouchEventArgs & touch){ 

} 

//-------------------------------------------------------------- 
void ofApp::touchMoved(ofTouchEventArgs & touch){ 

} 

//-------------------------------------------------------------- 
void ofApp::touchUp(ofTouchEventArgs & touch){ 

} 

//-------------------------------------------------------------- 
void ofApp::touchDoubleTap(ofTouchEventArgs & touch){ 

} 

//-------------------------------------------------------------- 
void ofApp::touchCancelled(ofTouchEventArgs & touch){ 

} 

//-------------------------------------------------------------- 
void ofApp::lostFocus(){ 

} 

//-------------------------------------------------------------- 
void ofApp::gotFocus(){ 

} 

//-------------------------------------------------------------- 
void ofApp::gotMemoryWarning(){ 

} 

//-------------------------------------------------------------- 
void ofApp::deviceOrientationChanged(int newOrientation){ 

} 

offApp.h

#pragma once 

#include "ofxiOS.h" 
#include "ofxGui.h" 

class ofApp : public ofxiOSApp { 

    public: 
     void setup(); 
     void update(); 
     void draw(); 
     void exit(); 

     void touchDown(ofTouchEventArgs & touch); 
     void touchMoved(ofTouchEventArgs & touch); 
     void touchUp(ofTouchEventArgs & touch); 
     void touchDoubleTap(ofTouchEventArgs & touch); 
     void touchCancelled(ofTouchEventArgs & touch); 

     void lostFocus(); 
     void gotFocus(); 
     void gotMemoryWarning(); 
     void deviceOrientationChanged(int newOrientation); 

    ofVideoGrabber theta; 
    vector<ofVideoDevice> devices; 
    ofShader shader; 
    ofFbo fbo; 
    ofEasyCam cam; 
    ofVboMesh sphere; 

    ofParameter<ofVec4f> offset; 
    ofParameter<float> radius; 
    ofParameter<bool> showSphere; 
    ofParameterGroup thetaParams; 
    ofxPanel gui; 
}; 

और यहाँ परिणाम है: iphone5s पर enter image description here

कृपया मुझे का कहना है मैं क्या मील ssed।

उत्तर

1

मैं ओपनफ्रेमवर्क से GPUImage पर स्विच करता हूं और दोहरी-फिशिए वीडियो को आईओएस उपकरणों पर सफलतापूर्वक समेकित प्रारूप में परिवर्तित करने में सक्षम हूं।

प्रयुक्त उसी शेडर प्रोग्राम। चेक my repository

+0

क्या आप मुझे GPUImage फ्रेमवर्क के भीतर कौन सा फ़ंक्शन इंगित करने में सक्षम होंगे, जिसका उपयोग आप एक फिशिए छवि को खोलने के लिए करते थे? – mm24

+0

मैंने इनपुट के रूप में एक एमपी 4 दोहरी-फिशिए फिल्म का उपयोग किया। और आउटपुट एक समकक्ष फिल्म फ़ाइल है। और मैंने ऐसा करने के लिए एक कस्टम फ़िल्टर लिखा था। मैं फिल्म से बनावट प्राप्त करने के लिए GPUImage का उपयोग करता हूं और इसे समेकित प्रारूप में परिवर्तित करने के लिए उपरोक्त कस्टम शेडर का उपयोग करता हूं। (शेडर प्रोग्राम संदर्भ https://github.com/yasuhirohoshino/thetaRealtimeEquirectangular) –

संबंधित मुद्दे