Warping d'images avec Core Image

adsads Membre
23:54 modifié dans API AppKit #1
Bonjour,
Apple dit dans la doc de Core Image qu'on peut faire du warping d'image
#

Warp or transform the geometry of an image.


le probleme c'est que je n'ai trouve aucun exemple concret montrant la chose.

En gros ce que je veux ces prendre 4 points sur une image source et transformer le contenu du rectangle d'origine vers un quadrilatere dans une autre image.

une illustration de l'effet recherche (sur le babouin) http://www.imagemagick.org/Usage/distorts/#bilinear

Si quelqu'un a une idee...
Merci

Réponses

  • CéroceCéroce Membre, Modérateur
    23:54 modifié #2
    C'est pour faire du morphing ? Effectivement, utiliser Core Image doit permettre d'exécuter les calculs très rapidement, et même en temps réel si les images ne sont pas trop grandes.

    Disons que "warp" est un terme très vague.
    Core Image Filter reference propose le filtre CIPerspectiveTransform qui semble se rapprocher de ce que tu veux.
  • AliGatorAliGator Membre, Modérateur
    avril 2010 modifié #3
    Si tu lances "Core Image Fun House" (que tu peux trouver avec Spotlight, il est dans /Developer/Applications/Graphics Tools") et que, une fois que tu as choisi une image à  traiter, tu rajoutes le filtre "Perspective Transform", tu peux faire exactement ce que tu veux.

    Ce qui montre que tu peux faire ce que tu souhaites à  priori avec CoreImage et en utilisant le filter "Perspective". Ca devrait déjà  aider pour rechercher les bons mots clés et les informations sur le filtre en ayant son nom ;)

    CIPerspectiveTransform Filter Reference

    Programming Guide sur les Core Image Filters (avec les bouts de code qui vont bien pour charger le filtre, le configurer, l'appliquer à  une image, ...)
  • adsads Membre
    23:54 modifié #4
    Merci Céroce et AliGator pour vos reponses.
    En effet, l'effet recherche ressemble, mais c'est legerement different, il y a une legere difference en le billinear warping et le perspective warping (cf mon lien plus haut), je recherche un effet de deformation sans effet de perspective.
    En tous cas, les liens fournis sont super interessant.

    Merci.
  • CéroceCéroce Membre, Modérateur
    avril 2010 modifié #5
    L'interpolation bilinéaire est plus facile à  coder, tu dois pouvoir créer ton propre CIFilter sans trop de difficultés. Je crois que tu y es obligé, à  moins que tu puisses utiliser une matrice de transformation, mais je ne suis pas sûr qu'il s'agisse d'une transformation linéaire (comme la rotation ou la mise à  l'échelle).
  • p3consultingp3consulting Membre
    23:54 modifié #6
    http://gallery.me.com/p3consulting#100020
    http://gallery.me.com/p3consulting#100025

    l'effet de droite peut correspondre à  ce que vous cherchez... mais ce n'est pas un CIFilter...
    c'est du texture mapping sur une grille mais la déformation peut-être plus "fun" comme le montre l'effet de gauche...
    (en fait le même effet mais avec des paramètres différents...)
  • adsads Membre
    23:54 modifié #7
    Bonjour,
    c'est tout a fait ce que je recherche.
    il y a un bout de code somewhere pour cela ?
    Merci
  • p3consultingp3consulting Membre
    23:54 modifié #8
    si ce n'est que la partie "trapèze" qui vous intéresse, c'est assez simple :

    en partant du principe que vous savez associé une NSImage à  une texture GL_TEXTURE_RECTANGLE_EXT

    il suffit de faire une grille et de boucler sur celle-ci :
    vous aurez un step de grille pour l'image et un autre pour la texture
    et d'une fonction qui "map" un point du rectangle original  dans le trapèze...
    ce qui est assez simple à  écrire...

    ...évidemment la fonction MapPoint quand on déforme le rectangle avec des courbes de Bezier est un poil plus compliquée...


    en ± pseudo code, cela donne :

    <br />deltaX = image.width * DELTA_INCREMENT ; // par exemple 0.025 pour DELTA_INCREMENT =&gt; déterminera la qualité<br />deltaY = image.height * DELTA_INCREMENT ;<br /><br />texDeltaX = texture.width&nbsp; * DELTA_INCREMENT ;<br />texDeltaY = texture.height&nbsp; * DELTA_INCREMENT ;<br /><br />for(x=image.left, tx = 0.0 ; x &lt; image.right ; x += deltaX ; tx += texDeltaX )<br />&nbsp; &nbsp; for(y=image.bottom, ty = texture.height ; y &lt; image.top ; y += deltaY, ty -= texDeltaY) {<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; CPoint p = MapPoint( CPoint( x, y ) ) ;<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; glBegin(GL_POLYGON);<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; glTexCoord2f(tx,ty) ;	<br />&nbsp; &nbsp; &nbsp; &nbsp; glVertex2f(p.x,p.y);<br />							<br />&nbsp; &nbsp; &nbsp;  p = MapPoint(CPoint(x,y+dy))		;<br />&nbsp; &nbsp; &nbsp;  glTexCoord2f(tx,ty-tdy)		; 	<br />&nbsp; &nbsp; &nbsp;  glVertex2f(p.x,p.y);<br />							<br />&nbsp; &nbsp; &nbsp;  p = MapPoint(CPoint(x+dx,y+dy))	;<br />&nbsp; &nbsp; &nbsp;  glTexCoord2f(tx+tdx,ty-tdy)	;	<br />&nbsp; &nbsp; &nbsp;  glVertex2f(p.x,p.y);<br /><br />&nbsp; &nbsp; &nbsp;  p = MapPoint(CPoint(x+dx,y))		;<br />&nbsp; &nbsp; &nbsp;  glTexCoord2f(tx+tdx,ty)		;		<br />&nbsp; &nbsp; &nbsp;  glVertex2f(p.x,p.y);<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; glEnd();<br />&nbsp;  }<br />
    



Connectez-vous ou Inscrivez-vous pour répondre.