2010-12-07 52 views
2

J'utilise la transformation de Hough dans mon application à la fois en utilisant Matlab et OpenCV/labview et a constaté que pour certaines images, la Transformée de Hough a donné un ajustement de ligne manifestement erronée (toujours)Erreur de transformation hough dans matlab et openCV?

Voici le test et superposée images. L'angle semble correct, mais le rho est éteint. Sur l'image ci-dessous, vous verrez que l'image du haut essaie de placer une ligne sur le côté gauche de l'image originale et l'image du bas correspond à une ligne du côté droit de l'image.

alt text

Dans Matlab, j'appelle la fonction Hough par

[H1D,theta1D,rho1D] = hough(img_1D_dilate,'ThetaResolution',0.2); 

en C++, je parés les HoughLines OpenCV fonctionnent donc je finis avec seulement la partie que nous remplissons l'accumulateur. Notez que parce que ma résolution thêta est de 0,2, j'ai 900 angles à analyser. Les tabSin et tabCos sont définis avant la fonction de sorte qu'ils sont juste un sin et cos de l'angle. Notez que ces routines fonctionnent généralement bien, mais seulement pour des cas spécifiques, il fonctionne comme je l'ai montré.

double start_angle = 60.0; 
    double end_angle = 120.0; 
    double num_theta = 180; 
    int start_ang = num_theta * start_angle/180; 
    int end_ang = num_theta * end_angle/180; 
    int i,j,n,index; 
     for (i = 0;i<numrows;i++) 
     { 
      for (j = 0;j<numcols;j++) 
      { 
        if (img[i*numcols + j] == 100) 
       { 
        for (n = 0;n<180;n++) 
        { 
         index = cvRound((j*tabCos[n] + i * tabSin[n])) + (numrho-1)/2; 
         accum[(n+1) * (numrho+2) + index+1]++; 
        } 
       } 
      } 
     } 

TabCos et tabSin sont définis dans Labview avec ce code int32 i; float64 theta_prec; float64 tabSin [180]; float64 tabCos [180];

theta_prec = 1/180 * 3,14159; pour (i = 0; i < 180; i ++) { tabSin [i] = sin (i theta_prec); tabCos [i] = cos (i theta_prec); }

suggestions seraient grandement appréciés

+5

Tout code? Je n'aime pas deviner à partir d'images :) –

+0

modifié pour ajouter du code. – Denis

+0

Vous n'avez pas besoin d'une autre boucle pour 'numrho'? – nimcap

Répondre

1

Je suppose que je vais supprimer la réponse à ce problème. Je convertissais le rho et le thêta en m et b, puis calculais les valeurs de x et y à partir de m et b. Je crois que cela peut avoir causé une erreur de précision quelque part.

cette erreur a été corrigée en obtenant x et y directement à partir de rho et thêta plutôt que de passer par m et b.

la fonction est

y = -cos(theta)/sin(theta)*x + rho/sin(theta);