begin process at 2012 05 27 17:34:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > 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

Note :
Aucune note
Catégorie :Graphique Classé sous :opencl, imagerie, gradient, graphique, opengl Niveau :Initié Date de création :12/04/2011 Vu / téléchargé :2 795 / 116

Auteur : ciddiju

Ecrire un message privé
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • gradient - coord pola.rarTélécharger ce fichier [Réservé aux membres club]1 337 072 octets

Télécharger le zip


 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) IMAGE ANIMÉE DANS UNE COLONNE DE DATAGRIDVIEW par foliv57
Source avec Zip Source avec une capture Source .NET (Dotnet) TRIEUR DE PHOTOS par Le Pivert
Source avec Zip Source .NET (Dotnet) ENREGISTREMENT ET DIAGRAMME par jpot31
REDIMENSIONNEMENT D'IMAGE PHP par JStevens
Source avec Zip Source avec une capture Source .NET (Dotnet) POIDS D'UNE IMAGE BMP DE PROFONDEUR 24 BITS par dheroux

 Sources en rapport avec celle ci

Source avec Zip TRAITEMENT D'IMAGE PGM par Jios
Source avec Zip EVALUATEUR D'EXPRESSION ARITHMÉTIQUE par matrx180vTitanium
Source avec Zip Source avec une capture CONTACTS MANAGER par eapaceinfo
Source avec Zip Source avec une capture MAILLAGE 3D (VTK + QT) par ammoun007
Source avec Zip Source avec une capture UNE MINI INTRO (OPENGL + MINIFMOD) par Romano58

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


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&#233;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&#233;es opengl. En fait je dessine, je recupere les coordonn&#233;es de la souris (en RE interface graphique en c et c++ [ par toxjamescook ] Voila mon probleme c'est que je dois r&#233;alis&#233; des graphiques qu'on ne trouvent pas dans les bibliotheques windows comme des bargraphs tr&#232 OpenGL figé [ par keselbingo ] Bonsoir &#224; tous, Je viens de lire les dix pages de sujets sur OpenGL du forum, et je n'ai rien trouv&#233; qui ressemble &#224; 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&#233;er un programme sous visual c++ ou c++ builder qui me fait des calculs et adapter par exemple les r&#23 Texte graphique drawtext() [ par jbmartinez ] J'ai cr&#233;er un morpion avec des images en 3D en faisant appar&#232;tre du texte drawtexte() pour afficher le nombre de joueur, de partie, etc..Si


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales