Salut à tous,
J'essaye de retourner le flux d'image provenant de ma webcam pour voir à l'écran comme dans un miroir.
J'ai beaucoup chipoter et je suis presque au bout de mes peines, il me manque juste un petit quelque chose.
Voilà mon résultat pour le moment :
C'est plutôt glitch mais pas ce que je cherche, le sens du miroir est bon ainsi que les proportions mais j'ai tout en triple et les canaux couleurs sont éclatés.
Voici le code :
void testApp::update(){ vidGrabber.grabFrame(); if (vidGrabber.isFrameNew()){ unsigned char * pixels = vidGrabber.getPixels(); for(int j = 0; j < camWidth; j++){ for (int i = 0; i < camHeight*3; i++){ videoInverted[i*camWidth+j*3] = pixels[((camWidth - (j*3-1)) + i*camWidth)]; //c'est ici qu'il manque un petit quelque chose } } videoTexture.loadData(videoInverted, camWidth,camHeight, GL_RGB); } }
Avis avisés bienvenus;)
Hors ligne
hello
j'ai pas regardé de près mais déjà c'est bizarre ton
camHeight*3
il ya une formule sur le forum processing, qui je pense est applicable ici :
int x = pixels.length % width;
int y = pixels.length / width;
à tous hasards...
http://processing.org/discourse/yabb2/Y … 1150745537
Hors ligne
rectification
pixels[i+j*width]=pixels[i+(camHeight-j)*width]
sous processing
donc ptet ça marche ça dans ton truc :
videoInverted[i+j*camWidth] =videoInverted[i+(camHeight-j)*camWidth]
Dernière modification par cdriko (2011-05-14 17:15:21)
Hors ligne
Merci pour ton aide mais j'ai besoin de faire le *3 et c'est là qu'est la difficulté.
Le *3 sert pour les 3 canaux RGB de chaque pixel en oF ils sont séparés.
J'ai essayé ton code seul et avec des *3 mais j'ai des erreurs de segmentation, ce qui signifie que les tableaux ne correpondent pas.
Si quelqu'un à une idée ...
Hors ligne
Il y aura toujours des gens pour réinventer la roue....
C'est tout con t'as une fonction dans OpenCV qui s'appelle FLIP_HORIZONTAL qui le fait très bien..
IL y en a plein d'autre d'ailleurs qui font des trucs cools.
Voilà le lien http://ubaa.net/shared/processing/openc … _flip.html
Et voici le code que tu voulais..:
import hypermedia.video.*;
OpenCV opencv;
void setup() {
size( 640, 480 );
opencv = new OpenCV(this);
opencv.capture( 320, 240 );
}
void draw() {
opencv.read();
opencv.flip( OpenCV.FLIP_HORIZONTAL ); // flip vertically and horizontally
opencv.absDiff();
// display images
image( opencv.image(OpenCV.SOURCE), 0, 0 );
image( opencv.image(), 320, 0 );
}
Hors ligne
Mille excuses je pensais que c'était sur Processing...
Je ne me suis pas encore mis à OpenFrameworks...
Hors ligne
Y'a pas de mal ,
peut-être que ça va relancer l'intérêt de ce post en attendant je n'ai toujours pas trouvé le bon algorythme.
Hors ligne
Bonsoir,
je vais sûrement dire une connerie mais comme tu ne parles pas d'avoir l'image dans les deux sens, la solution ne serait elle pas de paramétrer ta cam directement depuis son soft de configuration pour faire le flip ?
J'dis ça hein... j'dis rien.
Hors ligne
Encore une technique P5 mais sûrement transposable et sans manip de pixel:
image(img, 0, 0);
scale(-1, 1); //permet "retourner" l'image sur l'axe X et change pas l'échelle sur l'axe Y
translate(img.width, 0);//pour replacer l'image à sa position d'origine
Hors ligne
Ok, merci, j'ai pas le temps d'essayer pour le moment mais dès que je peux, je vous tiens au courant.
Hors ligne
Hors ligne
Bonne idée,
J'ai essayé avec ofxImage qui propose une fonction mirror() mais malheureusement elle s'applique à une image, pas à un flux provenant de la webcam.
Il y a peut-être moyen de changer un flux en image mais ça reste à voir.
C'est bête je suis à un cheveu de la solution ...
Hors ligne
et les wrapper opencv, ils ne possèdent pas la fonction mentionner plus haut ?
Hors ligne
Je suis tombé la dessus en cherchant un tuto pour débutter openframework en parralèle de ma découverte du c++
http://vormplus.be/blog/article/mirrori … frameworks
Hors ligne
Super, merci beaucoup
Voici les précieuses lignes de codes ; j'étais encore loin de trouver :
void testApp::update(){ vidGrabber.grabFrame(); if (vidGrabber.isFrameNew()){ unsigned char * pixels = vidGrabber.getPixels(); for(int i = 0; i < camHeight; i++){ for (int j = 0; j < camWidth*3; j+=3){ int pix1 = (i*camWidth*3) + j; int pix2 = (i*camWidth*3) + (j+1); int pix3 = (i*camWidth*3) + (j+2); // mirror pixel number int mir1 = (i*camWidth*3)+1 * (camWidth*3 - j-3); int mir2 = (i*camWidth*3)+1 * (camWidth*3 - j-2); int mir3 = (i*camWidth*3)+1 * (camWidth*3 - j-1); // swap pixels videoInverted[pix1] = pixels[mir1]; videoInverted[pix2] = pixels[mir2]; videoInverted[pix3] = pixels[mir3]; } } videoTexture.loadData(videoInverted, camWidth,camHeight, GL_RGB); } }
Si tu veux je suis tombé dernièrement sur de chouettes tutos pour openframeworks, dont un pour débuter et un très complet sur openCv :
http://pkmital.com/home/teaching/
Hors ligne