访问类不可能

时间:2016-07-26 07:58:36

标签: c# visual-studio-2012

我创建了一个名为“Descripteurs”的课程。我想调用这个类来创建一个csv文件。所以我调用了我在“Descriptors”类中创建的描述符列表。 我无法将我的像素位置与描述符相关联,以将其存储在我的csv中。

我的图像中的每个像素都应该包含“Descripteurs”类中的描述符(moyenne,黑色像素数,白色像素数.....)。 csv应该在每个像素中具有位置,并且所有描述符都在“Descripteurs”类中计算。我不知道是否存在线程问题。 我的功能在这里:

 public bool StoreIntoCsv(string pathOriginalPicture, string pathOriginalPictureWithOnlyOneLayer, int classe, BackgroundWorker worker, DoWorkEventArgs e)
    {
        //preprocessing of the original picture and the original picture with only one layer
        Descripteurs featuresPathOriginal = new Descripteurs(new Bitmap(pathOriginalPicture));// m_constructeur de la classe Descripteurs
        Bitmap binaryOriginalPictureWithOnlyOneLayer = new Bitmap(pathOriginalPictureWithOnlyOneLayer); // correspond à l'image binaire avec le L. 

        //we want to get the class of the picture
        string[] res = pathOriginalPicture.Split('\\');
        string classeName = res[res.Count() - 2]; // count = compter

        //retrieving the file path of the csv
        string pathFolder = pathOriginalPicture.Split('.').First();// le split divise la chaine en sous chaine en fonction des caractères 
        pathFolder = pathFolder.Remove(pathFolder.LastIndexOf('\\'));
        string pathCsv = pathFolder + "\\" + classeName + ".csv";

        libaforge.AForge.IntPoint pixel = new libaforge.AForge.IntPoint();

        //open the stream
        using (StreamWriter stream = File.AppendText(pathCsv)) //streamwriter permet d'écrire dans un fichier
        {
            //browse all the picture
            for (int x = 0; x < binaryOriginalPictureWithOnlyOneLayer.Width; x = x + 2)
            {
                for (int y = 0; y < binaryOriginalPictureWithOnlyOneLayer.Height; y = y + 2)
                {
                    //the user stop the application
                    if (worker.CancellationPending)//checks for cancel request
                    {
                        e.Cancel = true;
                        return false;
                    }

                    //we know, where is it the pixel black on the data set training
                    if (binaryOriginalPictureWithOnlyOneLayer.GetPixel(x, y).ToArgb() == Color.Black.ToArgb())
                    {
                        pixel.X = x;
                        pixel.Y = y;                            

                        WriteLineToCsv(pixel, featuresPathOriginal.Extract_Desscripteurs(pixel), classe, stream);
                    }
                }
            }
            return true;               
        }
    }

我的班级“Descripteurs在这里:

namespace ProjetPRD
{
extern alias libaforge;

public class Descripteurs
{
    //private Bitmap _imageLidar;
    private static Bitmap image;

    public Descripteurs(Bitmap img)
    {
        image = img;
    }

        //public static List <double> Extract_Desscripteurs(Bitmap image)
        //public static List <double> Extract_Desscripteurs(libaforge.AForge.IntPoint pixel)
        public double[] Extract_Desscripteurs(libaforge.AForge.IntPoint pixel)

    {
        int pixel_Central = 0;

        double Moy2_Haut_Gauche = 0;
        double Moy3_Haut_Droite = 0;
        double Moy4_Bas_Gauche = 0;
        double Moy5_Bas_Droite = 0;

        int Difference = 0; // pour calculer la difference entre la valeur max et la valeur min de notre masc
        int Nb_PNoir_Haut_Gauche = 0;
        int Nb_PBlanc_Haut_Gauche = 0;
        int Nb_PGris_Haut_Gauche = 0;

        int Nb_PNoir_Haut_Droite = 0;
        int Nb_PBlanc_Haut_Droite = 0;
        int Nb_PGris_Haut_Droite = 0;

        int Nb_PNoir_Bas_Gauche = 0;
        int Nb_PBlanc_Bas_Gauche = 0;
        int Nb_PGris_Bas_Gauche = 0;

        int Nb_PNoir_Bas_Droite = 0;
        int Nb_PBlanc_Bas_Droite = 0;
        int Nb_PGris_Bas_Droite = 0;

        List<double> caracteristique = new List <double>();

        lock (image )
        {
            BitmapData bmd = new BitmapData();
        try
        {
            Rectangle Rect = new Rectangle(0, 0, image.Width, image.Height);
            bmd = image.LockBits(Rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
            //System.Drawing.Imaging.BitmapData bmpData = bmd.LockBits(Rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,bmd.PixelFormat);

            unsafe
            {
                byte* Ptr = (byte*)bmd.Scan0;

                for (int j = 0; j < bmd.Height; j++)
                {
                    for (int i = 0; i < bmd.Width; i++)
                    {
                        //initialisation des différents éléments du masque 3*3

                        int couleur1 = Ptr[j * bmd.Width + i];
                        int couleur2 = Ptr[j * bmd.Width + (i + 1)];
                        int couleur3 = Ptr[j * bmd.Width + (i + 2)];
                        int couleur4 = Ptr[(j + 1) * bmd.Width + i];
                        pixel_Central = Ptr[(j + 1) * bmd.Width + (i + 1)];
                        int couleur6 = Ptr[(j + 1) * bmd.Width + (i + 2)];
                        int couleur7 = Ptr[(j + 2) * bmd.Width + (i)];
                        int couleur8 = Ptr[(j + 2) * bmd.Width + (i + 1)];
                        int couleur9 = Ptr[(j + 2) * bmd.Width + (i + 2)];

                        //faire la moyenne de chaque bloc de 4
                        Moy2_Haut_Gauche = (couleur1 + couleur2 + couleur4 + pixel_Central) / 4;
                        Moy3_Haut_Droite = (couleur2 + couleur3 + pixel_Central + couleur6) / 4;
                        Moy4_Bas_Gauche = (couleur4 + pixel_Central + couleur7 + couleur8) / 4;
                        Moy5_Bas_Droite = (pixel_Central + couleur6 + couleur8 + couleur9) / 4;

                        //remplir la liste des caractéristiques
                        caracteristique.Add(pixel_Central);
                        caracteristique.Add(Moy2_Haut_Gauche);
                        caracteristique.Add(Moy3_Haut_Droite);
                        caracteristique.Add(Moy4_Bas_Gauche);
                        caracteristique.Add(Moy5_Bas_Droite);

                        int[] tab_Difference = { couleur1, couleur2, couleur3, couleur4, pixel_Central, couleur6, couleur7, couleur8, couleur9 };
                        Difference = tab_Difference.Max() - tab_Difference.Min();

                        int[] tab = { couleur1, couleur2, couleur4, pixel_Central };
                        for (int k = 0; k < tab.Length; k++)
                        {
                            if (tab[k] < 60)
                            {
                                Nb_PNoir_Haut_Gauche++;
                            }

                            else
                            {
                                if (tab[k] > 180)
                                {
                                    Nb_PBlanc_Haut_Gauche++;
                                }
                                else
                                {
                                    Nb_PGris_Haut_Gauche++;
                                }
                            }
                        }

                        int[] tab2 = { couleur2, couleur3, pixel_Central, couleur6 };
                        for (int m = 0; m < tab2.Length; m++)
                        {
                            if (tab2[m] < 60)
                            {
                                Nb_PNoir_Haut_Droite++;
                            }
                            else
                            {
                                if (tab2[m] > 180)
                                {
                                    Nb_PBlanc_Haut_Droite++;
                                }
                                else
                                {
                                    Nb_PGris_Haut_Droite++;
                                }
                            }
                        }

                        int[] tab3 = { couleur4, pixel_Central, couleur7, couleur8 };
                        for (int n = 0; n < tab3.Length; n++)
                        {
                            if (tab3[n] < 60)
                            {
                                Nb_PNoir_Bas_Gauche++;
                            }
                            else
                            {
                                if (tab3[n] > 180)
                                {

                                    Nb_PBlanc_Bas_Gauche++;
                                }
                                else
                                {
                                    Nb_PGris_Bas_Gauche++;
                                }
                            }
                        }

                        int[] tab4 = { pixel_Central, couleur6, couleur8, couleur9 };
                        for (int n = 0; n < tab4.Length; n++)
                        {
                            if (tab4[n] < 60)
                            {
                                Nb_PNoir_Bas_Droite++;
                            }
                            else
                            {
                                if (tab4[n] > 180)
                                {
                                    Nb_PBlanc_Bas_Droite++;
                                }
                                else
                                {
                                    Nb_PGris_Bas_Droite++;
                                }
                            }
                        }

                        caracteristique.Add(Difference);

                        caracteristique.Add(Nb_PNoir_Haut_Gauche);
                        caracteristique.Add(Nb_PNoir_Haut_Droite);
                        caracteristique.Add(Nb_PNoir_Bas_Gauche);
                        caracteristique.Add(Nb_PNoir_Bas_Droite);
                        caracteristique.Add(Nb_PBlanc_Haut_Gauche);
                        caracteristique.Add(Nb_PBlanc_Haut_Droite);
                        caracteristique.Add(Nb_PBlanc_Bas_Gauche);
                        caracteristique.Add(Nb_PBlanc_Bas_Droite);
                        caracteristique.Add(Nb_PGris_Haut_Gauche);
                        caracteristique.Add(Nb_PGris_Haut_Droite);
                        caracteristique.Add(Nb_PGris_Bas_Gauche);
                        caracteristique.Add(Nb_PGris_Bas_Droite);
                    }
                }
                //mesCaracteristiques = caracteristique.ToArray();
            }
        }
        finally
        {
            image.UnlockBits(bmd);
        }
        //e.Graphics.DrawImage(bmd, 0, 150);

        //return mesCaracteristiques;
        return caracteristique.ToArray();
        }
    }
}
}

我不知道我的说明是否清楚,但我真的需要帮助。

0 个答案:

没有答案