Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
DÉTECTION DES CERCLES DANS UNE IMAGE: HOUGH
Information sur la source
Description
Le principe de base de la détection des cercles est très simple: On dessine les contours de l'image et pour tous les points appartenant aux contours, on dessine dans l’accumulateur un cercle de rayon R. Si l'on cherche à détecter un cercle de rayon R alors, le point de l'accumulateur ayant reçu le plus de suffrage sera le centre du cercle recherché. Avantages de cette méthode : on peut détecter un cercle même s'il est partiellement caché ou même si l'image est très bruité. Rapide et très robuste si l'on connais le rayon du cercle rechercher. Inconvénients: ce traitement nécessite de connaître approximativement le rayon du cercle recherché. Cette source propose 3 petits traitements mettant en relief les avantages de cette méthode. Les trois traitements sont accessibles en cliquant sur les trois icônes correspondantes dans la barre d'outil. -Traitement 1 : Découverte de la méthode: on sélectionne un intervalle de rayon possible et le programme trouve le cercle le plus adapté. -Traitement 2 : Robustesse au bruit : on ajoute du bruit dans l'image et on observe si la détection du cercle est toujours bonne.(ici, on détecte un cercle partielle) -Traitement 3 : Application simple: Détection de la pupille et de l'iris d'un œil.
Source
- //****************************************************************************************
- //MORARD Vincent
- //vincent.morard@cpe.fr
- //pistol.petesampras.free.fr
- //****************************************************************************************
-
- #include "CImage.h"
- #include "DlgCallback.h"
- void Message5(HWND hList,HWND hDlg,char *Mes,int Buf)
- {
- SendMessage(hList,LB_ADDSTRING, 0, (LONG)Mes);
- SendMessage(hDlg,WM_UPDATE,Buf,0);
- Sleep(0);
- }
- //************************************************************************************
- //Thread Cercle3 : Détection de cercle sur l'image d'un oeil.
- //Le but de ce traitement est de détecter le contour de la pupile ainsi que le contour de l'iris
- //Le but final étant de trouver le centre de l'oeil et les rayon des cercles associés.
- //************************************************************************************
- DWORD WINAPI DetectionCercle3(LPVOID lpParam )
- {
- HWND hDlg,hOK,hwndList;
- int R,X,Y;
-
- hDlg=(HWND) lpParam;
- hwndList=GetDlgItem(hDlg, IDC_LIST1);
- hOK=GetDlgItem(hDlg, IDOK);
-
- int t = GetTickCount(); //initialisation du temps
-
- SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)"Début du traitement");
-
- if(Img[0].LoadBmp("./Hough.bmp")==0)return 0;
- Img[0].ConvertRGB2Gray();
- Message5(hwndList,hDlg,"Ouverture de l'image : Fait",0);
-
- if(Img[0].Sobel(GRAY,&Img[1])==0)return 0;
- Message5(hwndList,hDlg,"Sobel : Fait",1);
-
- if(Img[1].Threashold(254,&Img[2])==0)return 0;
- Message5(hwndList,hDlg,"Seuillage : Fait",2);
-
- if(Img[2].HoughCircleCompute(36,38,&Img[3],&X,&Y,&R)==0)return 0;
- if(Img[3].HoughContrasteAuto()==0)return 0;
- Message5(hwndList,hDlg,"Hough: détection de cercle : Fait",3);
-
- if(Img[0].DrawCircle(R,X,Y,255,0,0)==0)return 0;
- Message5(hwndList,hDlg,"Dessin du cercle trouvé : Fait",0);
-
- //Fin de la détection de la pupile coord: R, X, Y
-
- if(Img[0].Median(GRAY,9,40,&Img[4])==0)return 0;
- Message5(hwndList,hDlg,"Filtre médian : Fait",4);
-
- if(Img[4].Sobel(GRAY,&Img[5])==0)return 0;
- Message5(hwndList,hDlg,"Sobel : Fait",5);
-
- if(Img[5].Threashold(20,&Img[6])==0)return 0;
- Message5(hwndList,hDlg,"Seuillage: Fait",6);
-
- if(Img[6].HoughCircleCompute(100,100,&Img[7],&X,&Y,&R)==0)return 0;
- if(Img[7].HoughContrasteAuto()==0)return 0;
- Message5(hwndList,hDlg,"Hough: detection de cerlce : Fait",6);
-
- if(Img[0].DrawCircle(R,X+1,Y+1,0,255,0)==0)return 0;
- Message5(hwndList,hDlg,"Dessin du cercle trouvé : Fait",0);
-
- //Fin du traitement, le second cercle est de coordonnée R,X,Y
-
- SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)"Fin du traitement, temps (ms) ");
- t = GetTickCount() - t;
- char Buf[20];
- strcpy(Buf,itoa(t,Buf,10));
- SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)Buf);
-
- EnableWindow(hOK,TRUE);
- return 1;
-
- }
//****************************************************************************************
//MORARD Vincent
//vincent.morard@cpe.fr
//pistol.petesampras.free.fr
//****************************************************************************************
#include "CImage.h"
#include "DlgCallback.h"
void Message5(HWND hList,HWND hDlg,char *Mes,int Buf)
{
SendMessage(hList,LB_ADDSTRING, 0, (LONG)Mes);
SendMessage(hDlg,WM_UPDATE,Buf,0);
Sleep(0);
}
//************************************************************************************
//Thread Cercle3 : Détection de cercle sur l'image d'un oeil.
//Le but de ce traitement est de détecter le contour de la pupile ainsi que le contour de l'iris
//Le but final étant de trouver le centre de l'oeil et les rayon des cercles associés.
//************************************************************************************
DWORD WINAPI DetectionCercle3(LPVOID lpParam )
{
HWND hDlg,hOK,hwndList;
int R,X,Y;
hDlg=(HWND) lpParam;
hwndList=GetDlgItem(hDlg, IDC_LIST1);
hOK=GetDlgItem(hDlg, IDOK);
int t = GetTickCount(); //initialisation du temps
SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)"Début du traitement");
if(Img[0].LoadBmp("./Hough.bmp")==0)return 0;
Img[0].ConvertRGB2Gray();
Message5(hwndList,hDlg,"Ouverture de l'image : Fait",0);
if(Img[0].Sobel(GRAY,&Img[1])==0)return 0;
Message5(hwndList,hDlg,"Sobel : Fait",1);
if(Img[1].Threashold(254,&Img[2])==0)return 0;
Message5(hwndList,hDlg,"Seuillage : Fait",2);
if(Img[2].HoughCircleCompute(36,38,&Img[3],&X,&Y,&R)==0)return 0;
if(Img[3].HoughContrasteAuto()==0)return 0;
Message5(hwndList,hDlg,"Hough: détection de cercle : Fait",3);
if(Img[0].DrawCircle(R,X,Y,255,0,0)==0)return 0;
Message5(hwndList,hDlg,"Dessin du cercle trouvé : Fait",0);
//Fin de la détection de la pupile coord: R, X, Y
if(Img[0].Median(GRAY,9,40,&Img[4])==0)return 0;
Message5(hwndList,hDlg,"Filtre médian : Fait",4);
if(Img[4].Sobel(GRAY,&Img[5])==0)return 0;
Message5(hwndList,hDlg,"Sobel : Fait",5);
if(Img[5].Threashold(20,&Img[6])==0)return 0;
Message5(hwndList,hDlg,"Seuillage: Fait",6);
if(Img[6].HoughCircleCompute(100,100,&Img[7],&X,&Y,&R)==0)return 0;
if(Img[7].HoughContrasteAuto()==0)return 0;
Message5(hwndList,hDlg,"Hough: detection de cerlce : Fait",6);
if(Img[0].DrawCircle(R,X+1,Y+1,0,255,0)==0)return 0;
Message5(hwndList,hDlg,"Dessin du cercle trouvé : Fait",0);
//Fin du traitement, le second cercle est de coordonnée R,X,Y
SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)"Fin du traitement, temps (ms) ");
t = GetTickCount() - t;
char Buf[20];
strcpy(Buf,itoa(t,Buf,10));
SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)Buf);
EnableWindow(hOK,TRUE);
return 1;
}
Conclusion
Le logiciel en lui même permettant ces traitements à aussi été amélioré: -Drag and drop des image provenant de fichier vers le logiciel -Scroll verticale et horizontale
Historique
- 13 février 2008 00:00:38 :
- Mise en forme
Sources de la même categorie
Commentaires
Discussions en rapport avec ce code source
|
CalendriCode
| | | L | M | M | J | V | S | D |
| | 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 | | | |
|
Téléchargements
Logiciels à télécharger sur le même thème :
|