Accueil > > > OPENCL : CALCUL ET AFFICHAGE DU GRADIENT COULEUR D'UNE WEBCAM (RGB24)
OPENCL : CALCUL ET AFFICHAGE DU GRADIENT COULEUR D'UNE WEBCAM (RGB24)
Information sur la source
Description
c'est un filtre non lineaire de qui cherche a bien determiner la direction du gradient. en appuyant sur "ESPACE" on peut ameliorer le resultat en débruitant o préalable l'image. en appuyant sur "G" on passe successivement de : norme gradient -> mix (norme,direction) -> direction gradient on utilise une pallette de couleurs ( style caméra thermique ) pour bien mettre en évidence les données. ca peut faire un jolie effet... par contre y risque de manquer des dll ou fichiers bin donc dite moi si ya des problemes...
Source
- //512
- //OpenCL
-
- const sampler_t samp = CLK_ADDRESS_CLAMP_TO_EDGE ;
- const sampler_t sampi = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;
-
-
- __kernel void load (__read_only image2d_t in0, __write_only image2d_t out, __local uchar *ld, __constant char *gld, int spc, __read_only image2d_t cfc)
- {
- int2 po = (int2)(get_global_id(0), get_global_id(1));
- int dcy = 4+get_local_size (0);
- int dcl = dcy*3;
-
- const int pc = (dcy*(2+get_local_id (1))+2+get_local_id (0));
- char sx=1,sy=1;
- if (get_local_id(0)<4) sx=-1;
- if (get_local_id(1)<6) sy=-1;
-
- float4 lv;
- int pp;
- char cas=gld[(get_local_id(1)*get_local_size(0)+get_local_id(0))];
-
- switch (cas)
- {
- case 11:
- {
- lv = read_imagef (in0,samp,po+(int2)(5*sx,5)); pp = 3*(pc+5*sx+5*dcy);
- ld[pp] = (lv.x*255);
- ld[pp+1]=(lv.y*255);
- ld[pp+2]=(lv.z*255);
- }
- break;
- case 10:
- {
- lv = read_imagef (in0,samp,po+(int2)(4*sx,-5)); pp = 3*(pc+4*sx-5*dcy);
- ld[pp] = (lv.x*255);
- ld[pp+1]=(lv.y*255);
- ld[pp+2]=(lv.z*255);
- }
- break;
- case 9:
- {
- lv = read_imagef (in0,samp,po+(int2)(3,5*sy)); pp=3*(pc+5*sy*dcy+3);
- ld[pp] = (lv.x*255);
- ld[pp+1]=(lv.y*255);
- ld[pp+2]=(lv.z*255);
- }
- break;
- case 8:
- {
- lv = read_imagef (in0,samp,po+(int2)(-3,4*sy)); pp = 3*(pc+4*sy*dcy-3);
- ld[pp] = (lv.x*255);
- ld[pp+1]=(lv.y*255);
- ld[pp+2]=(lv.z*255);
- }
- break;
- case 7:
- {
- lv = read_imagef (in0,samp,po+(int2)(3*sx,0)); pp = 3*(pc+3*sx);
- ld[pp] = (lv.x*255);
- ld[pp+1]=(lv.y*255);
- ld[pp+2]=(lv.z*255);
- }
- break;
- case 6:
- {
- lv = read_imagef (in0,samp,po+(int2)(0,3*sy)); pp = 3*(pc+3*sy*dcy);
- ld[pp] = (lv.x*255);
- ld[pp+1]=(lv.y*255);
- ld[pp+2]=(lv.z*255);
- }
- break;
- case 5:
- {
- lv = read_imagef (in0,samp,po+(int2)(3*sx,3*sy)); pp=3*(pc+3*(sx+sy*dcy));
- ld[pp] = (lv.x*255);
- ld[pp+1]=(lv.y*255);
- ld[pp+2]=(lv.z*255);
- }
- break;
- case 4:
- {
- lv = read_imagef (in0,samp,po+(int2)(2*sx,2*sy)); pp=3*(pc+2*(sx+sy*dcy));
- ld[pp] = (lv.x*255);
- ld[pp+1]=(lv.y*255);
- ld[pp+2]=(lv.z*255);
- }
- break;
- case 3:
- {
- lv = read_imagef (in0,samp,po+(int2)(sx,sy)); pp=3*(pc+sx+sy*dcy);
- ld[pp] = (lv.x*255);
- ld[pp+1]=(lv.y*255);
- ld[pp+2]=(lv.z*255);
- }
- break;
- case 2:
- {
- lv = read_imagef (in0,samp,po+(int2)(0,sy)); pp=3*(pc+sy*dcy);
- ld[pp] = (lv.x*255);
- ld[pp+1]=(lv.y*255);
- ld[pp+2]=(lv.z*255);
- }
- break;
- case 1:
- {
- lv = read_imagef (in0,samp,po+(int2)(sx,0)); pp = 3*(pc+sx);
- ld[pp] = (lv.x*255);
- ld[pp+1]=(lv.y*255);
- ld[pp+2]=(lv.z*255);
- }
- break;
- default:
- break;
- }
- lv = read_imagef (in0,samp,po)*255;
- int r = lv.x,v = lv.y,b = lv.z;
- ld[3*pc+0] = r;
- ld[3*pc+1] = v;
- ld[3*pc+2] = b;
-
- barrier (CLK_LOCAL_MEM_FENCE);
-
- float mr=0,mv=0,mb=0;
- float som=0,cf=1;
- int rr,vv,bb;
-
- for (int j=-2; j<3; j++)
- {
- for (int i=-2; i<3; i++)
- {
- pp = j*dcl+3*(pc+i);
- rr=ld[pp];
- vv=ld[pp+1];
- bb=ld[pp+2];
-
- cf=read_imagef (cfc,samp,(int2)((abs(rr-r)+abs(vv-v)+abs(bb-b)),0)).x;//lmv[vp+i+5*j]
-
- mr+=rr*cf;
- mv+=vv*cf;
- mb+=bb*cf;
- som+=cf;
-
- }
- }
-
- if (spc) {mr = lv.x*som;mv = lv.y*som;mb = lv.z*som;}
-
- write_imagef (out, (int2)(get_global_id(0), 480-get_global_id(1)), (float4)(mb,mv,mr,0)/som/255);
-
- barrier (CLK_LOCAL_MEM_FENCE);
- }
-
- __kernel void gradient (__read_only image2d_t in, __write_only image2d_t grd)
- {
- int pw = get_global_id(0);
- int ph = get_global_id(1);
-
- float4 th = read_imagef (in,samp,(int2)(pw,ph));
-
- float4 rsx = th-read_imagef (in,samp,(int2)(pw-1,ph));
- float4 rsy = th-read_imagef (in,samp,(int2)(pw,ph-1));
- float4 rtx = th-read_imagef (in,samp,(int2)(pw+1,ph));
- float4 rty = th-read_imagef (in,samp,(int2)(pw,ph+1));
-
- float k1 = fast_length (rsx);
- float l1 = fast_length (rsy);
- float k2 = fast_length (rtx);
- float l2 = fast_length (rty);
-
- float4 gr = (float4)0;
-
- gr.z = gr.x += k1>k2?
- fast_length(rsx+read_imagef (in,samp,(int2)(pw,ph+1))-read_imagef (in,samp,(int2)(pw-1,ph+1))+read_imagef (in,samp,(int2)(pw,ph-1))-read_imagef (in,samp,(int2)(pw-1,ph-1))):
- fast_length(rtx+read_imagef (in,samp,(int2)(pw,ph+1))-read_imagef (in,samp,(int2)(pw+1,ph+1))+read_imagef (in,samp,(int2)(pw,ph-1))-read_imagef (in,samp,(int2)(pw+1,ph-1)));
-
- gr.z += gr.y += l1>l2?
- fast_length(rsy+read_imagef (in,samp,(int2)(pw+1,ph))-read_imagef (in,samp,(int2)(pw+1,ph-1))+read_imagef (in,samp,(int2)(pw-1,ph))-read_imagef (in,samp,(int2)(pw-1,ph-1))):
- fast_length(rty+read_imagef (in,samp,(int2)(pw+1,ph))-read_imagef (in,samp,(int2)(pw+1,ph+1))+read_imagef (in,samp,(int2)(pw-1,ph))-read_imagef (in,samp,(int2)(pw-1,ph+1)));
-
- write_imagef (grd, (int2)(pw,ph), gr);
- }
-
- __kernel void visu (__read_only image2d_t grd, __write_only image2d_t out, int nrm, __read_only image2d_t pcl)
- {
- int pw = get_global_id(0);
- int ph = get_global_id(1);
- float amp,lbd=1;
-
- float4 dx = read_imagef (grd,samp,(int2)(pw,ph));
-
- if (nrm==1)
- {
- dx.z *= 100;
- float dz = fabs(dx.z-(int)dx.z);
- amp = ((int)dx.z)%896+dz;
- amp = log2(2+amp/4)*192;
- amp -= (int)(amp/896)*896;
- }
- else
- {
- if (nrm==2)
- {
- //dx.z *= 100;
- lbd = sqrt(dx.z);
- amp = atan (dx.y/dx.x)/3.1415926535*896.0*2;
- }
- else
- {
- amp = atan (dx.y/dx.x)/3.1415926535*896.0*2;
- }
- }
-
- if (lbd>1) lbd=1;
-
- write_imagef (out, (int2)(pw,ph), read_imagef (pcl,samp,(int2)(amp,0))*lbd);
- }
//512
//OpenCL
const sampler_t samp = CLK_ADDRESS_CLAMP_TO_EDGE ;
const sampler_t sampi = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;
__kernel void load (__read_only image2d_t in0, __write_only image2d_t out, __local uchar *ld, __constant char *gld, int spc, __read_only image2d_t cfc)
{
int2 po = (int2)(get_global_id(0), get_global_id(1));
int dcy = 4+get_local_size (0);
int dcl = dcy*3;
const int pc = (dcy*(2+get_local_id (1))+2+get_local_id (0));
char sx=1,sy=1;
if (get_local_id(0)<4) sx=-1;
if (get_local_id(1)<6) sy=-1;
float4 lv;
int pp;
char cas=gld[(get_local_id(1)*get_local_size(0)+get_local_id(0))];
switch (cas)
{
case 11:
{
lv = read_imagef (in0,samp,po+(int2)(5*sx,5)); pp = 3*(pc+5*sx+5*dcy);
ld[pp] = (lv.x*255);
ld[pp+1]=(lv.y*255);
ld[pp+2]=(lv.z*255);
}
break;
case 10:
{
lv = read_imagef (in0,samp,po+(int2)(4*sx,-5)); pp = 3*(pc+4*sx-5*dcy);
ld[pp] = (lv.x*255);
ld[pp+1]=(lv.y*255);
ld[pp+2]=(lv.z*255);
}
break;
case 9:
{
lv = read_imagef (in0,samp,po+(int2)(3,5*sy)); pp=3*(pc+5*sy*dcy+3);
ld[pp] = (lv.x*255);
ld[pp+1]=(lv.y*255);
ld[pp+2]=(lv.z*255);
}
break;
case 8:
{
lv = read_imagef (in0,samp,po+(int2)(-3,4*sy)); pp = 3*(pc+4*sy*dcy-3);
ld[pp] = (lv.x*255);
ld[pp+1]=(lv.y*255);
ld[pp+2]=(lv.z*255);
}
break;
case 7:
{
lv = read_imagef (in0,samp,po+(int2)(3*sx,0)); pp = 3*(pc+3*sx);
ld[pp] = (lv.x*255);
ld[pp+1]=(lv.y*255);
ld[pp+2]=(lv.z*255);
}
break;
case 6:
{
lv = read_imagef (in0,samp,po+(int2)(0,3*sy)); pp = 3*(pc+3*sy*dcy);
ld[pp] = (lv.x*255);
ld[pp+1]=(lv.y*255);
ld[pp+2]=(lv.z*255);
}
break;
case 5:
{
lv = read_imagef (in0,samp,po+(int2)(3*sx,3*sy)); pp=3*(pc+3*(sx+sy*dcy));
ld[pp] = (lv.x*255);
ld[pp+1]=(lv.y*255);
ld[pp+2]=(lv.z*255);
}
break;
case 4:
{
lv = read_imagef (in0,samp,po+(int2)(2*sx,2*sy)); pp=3*(pc+2*(sx+sy*dcy));
ld[pp] = (lv.x*255);
ld[pp+1]=(lv.y*255);
ld[pp+2]=(lv.z*255);
}
break;
case 3:
{
lv = read_imagef (in0,samp,po+(int2)(sx,sy)); pp=3*(pc+sx+sy*dcy);
ld[pp] = (lv.x*255);
ld[pp+1]=(lv.y*255);
ld[pp+2]=(lv.z*255);
}
break;
case 2:
{
lv = read_imagef (in0,samp,po+(int2)(0,sy)); pp=3*(pc+sy*dcy);
ld[pp] = (lv.x*255);
ld[pp+1]=(lv.y*255);
ld[pp+2]=(lv.z*255);
}
break;
case 1:
{
lv = read_imagef (in0,samp,po+(int2)(sx,0)); pp = 3*(pc+sx);
ld[pp] = (lv.x*255);
ld[pp+1]=(lv.y*255);
ld[pp+2]=(lv.z*255);
}
break;
default:
break;
}
lv = read_imagef (in0,samp,po)*255;
int r = lv.x,v = lv.y,b = lv.z;
ld[3*pc+0] = r;
ld[3*pc+1] = v;
ld[3*pc+2] = b;
barrier (CLK_LOCAL_MEM_FENCE);
float mr=0,mv=0,mb=0;
float som=0,cf=1;
int rr,vv,bb;
for (int j=-2; j<3; j++)
{
for (int i=-2; i<3; i++)
{
pp = j*dcl+3*(pc+i);
rr=ld[pp];
vv=ld[pp+1];
bb=ld[pp+2];
cf=read_imagef (cfc,samp,(int2)((abs(rr-r)+abs(vv-v)+abs(bb-b)),0)).x;//lmv[vp+i+5*j]
mr+=rr*cf;
mv+=vv*cf;
mb+=bb*cf;
som+=cf;
}
}
if (spc) {mr = lv.x*som;mv = lv.y*som;mb = lv.z*som;}
write_imagef (out, (int2)(get_global_id(0), 480-get_global_id(1)), (float4)(mb,mv,mr,0)/som/255);
barrier (CLK_LOCAL_MEM_FENCE);
}
__kernel void gradient (__read_only image2d_t in, __write_only image2d_t grd)
{
int pw = get_global_id(0);
int ph = get_global_id(1);
float4 th = read_imagef (in,samp,(int2)(pw,ph));
float4 rsx = th-read_imagef (in,samp,(int2)(pw-1,ph));
float4 rsy = th-read_imagef (in,samp,(int2)(pw,ph-1));
float4 rtx = th-read_imagef (in,samp,(int2)(pw+1,ph));
float4 rty = th-read_imagef (in,samp,(int2)(pw,ph+1));
float k1 = fast_length (rsx);
float l1 = fast_length (rsy);
float k2 = fast_length (rtx);
float l2 = fast_length (rty);
float4 gr = (float4)0;
gr.z = gr.x += k1>k2?
fast_length(rsx+read_imagef (in,samp,(int2)(pw,ph+1))-read_imagef (in,samp,(int2)(pw-1,ph+1))+read_imagef (in,samp,(int2)(pw,ph-1))-read_imagef (in,samp,(int2)(pw-1,ph-1))):
fast_length(rtx+read_imagef (in,samp,(int2)(pw,ph+1))-read_imagef (in,samp,(int2)(pw+1,ph+1))+read_imagef (in,samp,(int2)(pw,ph-1))-read_imagef (in,samp,(int2)(pw+1,ph-1)));
gr.z += gr.y += l1>l2?
fast_length(rsy+read_imagef (in,samp,(int2)(pw+1,ph))-read_imagef (in,samp,(int2)(pw+1,ph-1))+read_imagef (in,samp,(int2)(pw-1,ph))-read_imagef (in,samp,(int2)(pw-1,ph-1))):
fast_length(rty+read_imagef (in,samp,(int2)(pw+1,ph))-read_imagef (in,samp,(int2)(pw+1,ph+1))+read_imagef (in,samp,(int2)(pw-1,ph))-read_imagef (in,samp,(int2)(pw-1,ph+1)));
write_imagef (grd, (int2)(pw,ph), gr);
}
__kernel void visu (__read_only image2d_t grd, __write_only image2d_t out, int nrm, __read_only image2d_t pcl)
{
int pw = get_global_id(0);
int ph = get_global_id(1);
float amp,lbd=1;
float4 dx = read_imagef (grd,samp,(int2)(pw,ph));
if (nrm==1)
{
dx.z *= 100;
float dz = fabs(dx.z-(int)dx.z);
amp = ((int)dx.z)%896+dz;
amp = log2(2+amp/4)*192;
amp -= (int)(amp/896)*896;
}
else
{
if (nrm==2)
{
//dx.z *= 100;
lbd = sqrt(dx.z);
amp = atan (dx.y/dx.x)/3.1415926535*896.0*2;
}
else
{
amp = atan (dx.y/dx.x)/3.1415926535*896.0*2;
}
}
if (lbd>1) lbd=1;
write_imagef (out, (int2)(pw,ph), read_imagef (pcl,samp,(int2)(amp,0))*lbd);
}
Conclusion
ca tourne largement en temps reel sur la GT220M de mon portable g pa essayer sur la gtx560... si vous pouvez pouvez envoyer vos "bench" ca seré cool... surtout pour voir comment se debrouille ATI
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Probleme affichage OpenGL [ par LudoBoOz ]
Bonjour @ tousVoila je fais une appli où j'ai besoin d'avoir trois scenes OpenGl sur une même fenetre Windows. Pour cela, j'ai créé 3 frames dans lesq
moteur graphique [ par vladisback ]
bonjour je pense depuis quelque temps a essayer de réaliser un moteur graphique (bien que ce ne soit peut etre pas le bon terme) comme opengl et direc
Comment debuter avec OpenGL [ par douggyfresh ]
douggy Je suis un amateur de la programmation graphique en c en mode console vga. Mais, j'aimerais faire de la programmation graphique 32 bits avec o
Comment recuperer les images d'une webcam avec OpenGL ???? [ par anthonygiroud ]
Bonjour a tous!J'ai un petit probleme. C'est pour mon sujet de stage : j'ai une webcam, et il faudrait,avec OpenGL, que je separe un individu qui est
Interface graphique en c ou C++ [ par toxjamescook ]
Bonjour je souhaites savoir comment créer une interface graphique pour windows xp en c ou c++ sans utiliser les activex d'un borlandbuilder ou au
passage coordonnées normalisé en opengl [ par seb_nachos ]
Bonjour, j'ai un probleme au niveau de la creation des coordonnées opengl. En fait je dessine, je recupere les coordonnées de la souris (en
RE interface graphique en c et c++ [ par toxjamescook ]
Voila mon probleme c'est que je dois réalisé des graphiques qu'on ne trouvent pas dans les bibliotheques windows comme des bargraphs trè
OpenGL figé [ par keselbingo ]
Bonsoir à tous, Je viens de lire les dix pages de sujets sur OpenGL du forum, et je n'ai rien trouvé qui ressemble à ce que j'ai, je s
Calcul en c++ interface graphique en visual basic possible??? [ par toxjamescook ]
bonjour je souhaites savoir si je peux créer un programme sous visual c++ ou c++ builder qui me fait des calculs et adapter par exemple les r
Texte graphique drawtext() [ par jbmartinez ]
J'ai créer un morpion avec des images en 3D en faisant apparètre du texte drawtexte() pour afficher le nombre de joueur, de partie, etc..Si
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|