Bonjour, j'ai un petit soucis avec de deux programmes : l'un constitue la classe mère(classe MonImage) et le deuxième constitue la classe fille(classe Canny).
Mon soucis est que la classe Canny implemente un algorithme et j'ai une interface graphique dans laquelle il y a un bouton Canny, quand je clique dessus, l'algorithme de Canny doit être éxecuté sur l'image chargée mais voila dans mon cas, j'obtiens l'erreur suivante :
HelloException in thread "AWT-EventQueue-0" java.lang.NullPointerException
at PI3.MonImage.conversionMatrice2(MonImage.java:99)
at PI3.Canny.<init>(Canny.java:28)


Voici ma classe mère et le compilateur me pointe la ligne suivante :
int largeur = matriceNdg.getLargeur();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
 
 
import java.io.*;
import java.awt.Color;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
 
 
public class MonImage {
 
	protected BufferedImage ImageCharger;	
	protected Matrice matriceNdg;
 
	public MonImage(String input) 	{
		try	{
				ImageCharger = ImageIO.read(new File(input));  // Lis l'image dans le buffer     				
		}
		catch(IOException exception) 
		{
			System.out.println("Lecture du fichier "+input+" impossible");
		}	
	}
 
	public MonImage(Matrice test) { 
		this.matriceNdg = new Matrice(test.getLargeur(),test.getHauteur());
		for(int j = 0; j < matriceNdg.getHauteur(); j++) { 
			for(int i = 0; i < matriceNdg.getLargeur(); i++) { 
				double pixel = test.getValeur(i, j);
				matriceNdg.setValeur(i, j, pixel);
			}
		}
	}
 
        public MonImage(BufferedImage image) {
		ImageCharger = image;
	}	
 
	public void dessinerImage()	{	// Cette methode dessine l'image en noir et blanc dans le buffer
 
		for (int x= 1; x < (ImageCharger.getWidth()-1); x++) {
			for (int y= 1; y < (ImageCharger.getHeight()-1); y++) {				
				int gris = (int)matriceNdg.getValeur(x,y);
				Color c = new Color(gris,gris,gris);
				int rgb = c.getRGB();
				ImageCharger.setRGB(x, y, rgb);
			}
		}
	} 
 
 
	public void conversionMatrice(Matrice test)	{
 
		int nbLignes = test.getLargeur();
		int nbCol = test.getHauteur();		
		for ( int j = 1 ; j < nbCol -1 ; j++ )	{
			for ( int i = 1 ; i < nbLignes - 1 ; i++) {
				int gris = (int)test.getValeur(i,j);		
				Color c = new Color(gris,gris,gris);
				int rgb = c.getRGB();
				ImageCharger.setRGB( i-1 , j-1 , rgb);
			}
		}
	}
 
	public void conversionMatrice2() {		
 
		System.out.println("Hello");
		int largeur = matriceNdg.getLargeur();
		int hauteur = matriceNdg.getHauteur();
		for (int j = 0; j < hauteur; j++)	{
			for (int i = 0 ; i < largeur; i++) {
				int gray = (int)matriceNdg.getValeur(i,j);
				Color c = new Color(gray,gray,gray);
				int rgb = c.getRGB();
				ImageCharger.setRGB(i, j, rgb);
			}
		}	
	}
 
	public void setMatrice(Matrice test) {
		this.matriceNdg = test;
	}
 
	public void sauverImage(String nom, String format)
	{
		try {
			    File fic= new File(nom+ "." + format);
			    ImageIO.write(getImage(), format, fic);
			    System.out.println("image enregistree");
			} 
		catch (IOException e) {
			    e.printStackTrace();
			}
		} 
}
Voici ma classe fille ou j'ai des appels de fonctions (je vous ai retiré les fonctions auxilaires pour faire moins gros):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
public class Canny extends MonImage {
 
	protected int seuilBas = 70;
	protected int seuilHaut = 140;
 
 
	public Canny(BufferedImage im) {
		super(im);
		MonImage image = new MonImage(im);
		Matrice niveauDeGris = new Matrice(image);
		Matrice kernel = new Matrice(3, 3);
		Matrice sobelX = new Matrice(3,3);
		Matrice sobelY = new Matrice(3,3);
		sobelX = sobelX.SobelX();
		sobelY = sobelY.SobelY();	
		kernel = kernel.filtreGaussien(1, 0.8);
		niveauDeGris = niveauDeGris.convolution(kernel);
		niveauDeGris.diviser(kernel);
		Canny nouveau_niveauDeGris = new Canny(niveauDeGris);	
		nouveau_niveauDeGris.gradient(sobelX, sobelY);
		nouveau_niveauDeGris.seuillageContours();
		image.conversionMatrice2();
	}
 
	public Canny(Matrice test) {
		super(test);
	}
 
}
Je n'arrive pas à comprendre pourquoi mon attribut matriceNdg n'est pas initialisé (d'après le compilateur bien sur) car pourtant j'ai bien un constructeur qui prend en parametre une matrice et qui la remplie. Donc si vous pouvez m'aider ou m'indiquer l'erreur que je ne vois pas, merci