2016-10-16 2 views
0

Я новичок в обработке и теперь пытаюсь использовать FaceOSC. Все уже было сделано, но играть в игру я сделал, когда все не зеркальное отображение. Поэтому я хочу перевернуть данные, которые FaceOSC отправил на обработку для создания видео.Как перевернуть FaceOSC в Processing3.2.1

Я не уверен, что FaceOSC отправил видео, потому что я попытался перевернуть как видео, но он не работает. Я также переворачивал, как изображение, и холст, но все равно не работает. Или может быть, я сделал это неправильно. Пожалуйста помоги!

// XXXXXXX // Это мой код.

import oscP5.*; 
import codeanticode.syphon.*; 

OscP5 oscP5; 
SyphonClient client; 

PGraphics canvas; 

boolean found; 
PVector[] meshPoints; 

void setup() { 
size(640, 480, P3D); 
frameRate(30); 
initMesh(); 

oscP5 = new OscP5(this, 8338); 

// USE THESE 2 EVENTS TO DRAW THE 
// FULL FACE MESH: 
    oscP5.plug(this, "found", "/found"); 
    oscP5.plug(this, "loadMesh", "/raw"); 
    // plugin for mouth 
    oscP5.plug(this, "mouthWidthReceived", "/gesture/mouth/width"); 
    oscP5.plug(this, "mouthHeightReceived", "/gesture/mouth/height"); 
     // initialize the syphon client with the name of the server 
    client = new SyphonClient(this, "FaceOSC"); 
    // prep the PGraphics object to receive the camera image 
    canvas = createGraphics(640, 480, P3D); 

} 

void draw() { 
    background(0); 
    stroke(255); 
// flip like a vdo here, does not work 
    /* pushMatrix(); 
    translate(canvas.width, 0); 
    scale(-1,1); 
    image(canvas, -canvas.width, 0, width, height); 
    popMatrix(); */ 

    image(canvas, 0, 0, width, height); 


    if (found) { 
    fill(100); 
    drawFeature(faceOutline); 
    drawFeature(leftEyebrow); 
    drawFeature(rightEyebrow); 
    drawFeature(nosePart1); 
    drawFeature(nosePart2);   
    drawFeature(leftEye);  
    drawFeature(rightEye);   
    drawFeature(mouthPart1); 
    drawFeature(mouthPart2); 
    drawFeature(mouthPart3); 
    drawFeature(mouthPart4); 
    drawFeature(mouthPart5); 
    } 


} 
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
void drawFeature(int[] featurePointList) { 
    for (int i = 0; i < featurePointList.length; i++) { 
    PVector meshVertex = meshPoints[featurePointList[i]]; 
    if (i > 0) { 
     PVector prevMeshVertex = meshPoints[featurePointList[i-1]]; 
line(meshVertex.x, meshVertex.y, prevMeshVertex.x, prevMeshVertex.y); 
} 
ellipse(meshVertex.x, meshVertex.y, 3, 3); 
    } 
} 
/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
public void found(int i) { 
    // println("found: " + i); // 1 == found, 0 == not found 
    found = i == 1; 
} 
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
+0

вы можете поделиться ссылками FaceOSC? Я имею в виду ссылку на библиотеку? –

+0

Вы можете легко найти это с помощью google. И FaceOSC не является библиотекой, это своего рода программа с открытым исходным кодом. –

ответ

0

scale() и translate() фрагмент кода вы пытаетесь использовать, имеет смысл, но это выглядит, как вы используете его в неправильном месте. Я не уверен, что делать с холстом, но я предполагаю, что черты лица рисуются с использованием drawFeature() звонков - это то, что вы хотите зеркалировать. Если это так, вы должны сделать эти звонки между pushMatrix() и popMatrix() звонками, сразу после scale().

Я хотел бы попробовать что-то подобное в розыгрыше():

void draw() { 
    background(0); 
    stroke(255); 
    //flip horizontal 
    pushMatrix(); 
    translate(width, 0); 
    scale(-1,1); 


    if (found) { 
    fill(100); 
    drawFeature(faceOutline); 
    drawFeature(leftEyebrow); 
    drawFeature(rightEyebrow); 
    drawFeature(nosePart1); 
    drawFeature(nosePart2);   
    drawFeature(leftEye);  
    drawFeature(rightEye);   
    drawFeature(mouthPart1); 
    drawFeature(mouthPart2); 
    drawFeature(mouthPart3); 
    drawFeature(mouthPart4); 
    drawFeature(mouthPart5); 
    } 

    popMatrix(); 
} 

Матричные вызовы тяни/поп изолировать координатного пространства. Происхождение системы координат (0,0) - верхний левый угол: вот почему все передается шириной перед масштабированием x на -1. Поскольку это не в центре, просто зеркалирование не оставляет содержимое в том же месте.

Для получения более подробной информации Извлечь Processing Transform2D tutorial

Вот простой пример:

boolean mirror; 

void setup(){ 
    size(640,480); 
} 
void draw(){ 
    if(mirror){ 
    pushMatrix(); 
    //translate, otherwise mirrored content will be off screen (pivot is at top left corner not centre) 
    translate(width,0); 
    //scale x -= 1 mirror 
    scale(-1,1); 
    //draw mirrored content 
    drawStuff(); 
    popMatrix(); 
    }else{ 
    drawStuff(); 
    } 
} 
//this could be be the face preview 
void drawStuff(){ 
    background(0); 
    triangle(0,0,width,0,0,height); 
    text("press m to toggle mirroring",450,470); 
} 
void keyPressed(){ 
    if(key == 'm') mirror = !mirror; 
} 

Другой вариант заключается в зеркало каждой координате, но в вашем случае это было бы много усилий, когда масштаб (-1 , 1) сделают трюк. Для справки, чтобы отразить координату, вам нужно просто вычесть текущее значение из наибольшего значения:

void setup(){ 
    size(640,480); 
    background(255); 
} 
void draw(){ 
    ellipse(mouseX,mouseY,30,30); 
    //subtract current value(mouseX in this case) from the largest value it can have (width in this case) 
    ellipse(width-mouseX,mouseY,30,30); 
} 

Вы можете запустить эти примеры здесь:

var mirror; 
 

 
function setup(){ 
 
    createCanvas(640,225); 
 
    fill(255); 
 
} 
 
function draw(){ 
 
    if(mirror){ 
 
    push(); 
 
    //translate, otherwise mirrored content will be off screen (pivot is at top left corner not centre) 
 
    translate(width,0); 
 
    //scale x -= 1 mirror 
 
    scale(-1,1); 
 
    //draw mirrored content 
 
    drawStuff(); 
 
    pop(); 
 
    }else{ 
 
    drawStuff(); 
 
    } 
 
} 
 
//this could be be the face preview 
 
function drawStuff(){ 
 
    background(0); 
 
    triangle(0,0,width,0,0,height); 
 
    text("press m to toggle mirroring",450,470); 
 
} 
 
function keyPressed(){ 
 
    if(key == 'M') mirror = !mirror; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.4/p5.min.js"></script>

function setup(){ 
 
    createCanvas(640,225); 
 
    background(0); 
 
    fill(0); 
 
    stroke(255); 
 
} 
 
function draw(){ 
 
    ellipse(mouseX,mouseY,30,30); 
 
    //subtract current value(mouseX in this case) from the largest value it can have (width in this case) 
 
    ellipse(width-mouseX,mouseY,30,30); 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.4/p5.min.js"></script>

Смежные вопросы