matthieu — 2011-05-14 13:03:27

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 :
http://codelab.fr/up/Capt.png

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;)

cdriko — 2011-05-14 17:11:27

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

cdriko — 2011-05-14 17:14:01

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]

matthieu — 2011-05-16 14:01:26

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 ...

Honkytong — 2011-12-04 23:29:47

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 );
}

Honkytong — 2011-12-04 23:33:05

Mille excuses je pensais que c'était sur Processing...
Je ne me suis pas encore mis à OpenFrameworks...

matthieu — 2011-12-05 11:23:28

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.

Turboconnard — 2012-01-13 21:01:36

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.

Makio135 — 2012-01-13 23:43:18

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

matthieu — 2012-01-16 18:57:35

Ok, merci, j'ai pas le temps d'essayer pour le moment mais dès que je peux, je vous tiens au courant.

cgiles — 2012-02-21 11:21:21

as tu regarder si il n'y a pas sur ce site ce qu'il te faut ?
http://ofxaddons.com/

matthieu — 2012-02-21 16:10:54

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 ...

cgiles — 2012-02-22 07:57:31

et les wrapper opencv, ils ne possèdent pas la fonction mentionner plus haut ?

cgiles — 2012-02-23 14:52:22

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

matthieu — 2012-02-24 16:25:23

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/