tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
1961
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    paul_meiz Tutorials.de Gastzugang
    Also wie schon im tittel erwähnt möchte ich blaue pixel in einem bild zählen,
    das bild wird in einer picturebox dargestellt und ist ein "image" (kein bitmap)

    also wird die anzahl der blauen (blauähnlichen) pixel von this.pictureBox1.Image gesucht.


    Ich hoffe ich habe mich klar genug ausgedrückt und bin hier an die richtigen leute geraten.


    Ps: benütze Microsoft Visual Studio 2008
     

  2. #2
    paul_meiz Tutorials.de Gastzugang
    sorry für den doppel poast bin aber nicht angemeldet

    habe vergessen zu erwähnen, dass die auswertung nich länger als 1 sec. dauern darf denke aber, dass das Zeitlimmit ausreichend ist.
    Bin auch für teillösungen dankbar!
     

  3. #3
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Du könntest ein Bitmap-Objekt erstellen, indem du dem Bitmap-Konstruktor das Image übergibst. Anschließend kannst du die Bitmap.GetPixel-Methode verwenden, um damit die Farbe jedes einzelnen Pixels zu überprüfen.
    Wie lange das dauert hängt von der Größe des Bildes und deiner CPU ab.
     

  4. #4
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    Und falls die Geschwindigkeit nicht reicht, such nach vb net getpixel fast way, zB http://www.bobpowell.net/lockingbits.htm

    mfg chmee
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

  5. #5
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Da GetPixel und SetPixel sehr langsam sind: http://ezinearticles.com/?Speed-Up-C...ing&id=1284701
     

  6. #6
    Avatar von 600emaster
    600emaster 600emaster ist offline Grünschnabel
    Registriert seit
    Jun 2005
    Ort
    55606 Kirn
    Beiträge
    3
    Da ich mal was ähnliches gemacht habe gebe ich dir mal die Funktion die ich verwende.
    (Es ist nicht alles von mir aber teilweise optimiert. )

    Code :
    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
    
            public static int getBluePixelCount(Bitmap pBild)
            {
                int Count=0;
                if (pBild == null) return Count;
                // GDI+ still lies to us - the return format is BGR, NOT RGB.
                BitmapData bmData = pBild.LockBits(new Rectangle(0, 0, pBild.Width, pBild.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
     
     
                int scanline = bmData.Stride;
     
                System.IntPtr Scan0 = bmData.Scan0;
     
     
                unsafe
                {
                    byte* pSrc = (byte*)(void*)Scan0;
                    byte r, g, b;
     
                    int nOffset = bmData.Stride - pBild.Width * 3;
     
     
                    int nWidth = pBild.Width;
                    int nHeight = pBild.Height;
                    int Offset;
     
                    for (int yOffset = 0; yOffset < nHeight * scanline; yOffset += scanline)
                    {
                        for (int xOffset = 0; xOffset < nWidth * 3; xOffset += 3)
                        {
                            Offset = yOffset + xOffset;
                            b = pSrc[Offset];                 // Blauanteil
                            g = pSrc[Offset + 1];             // Grünanteil
                            r = pSrc[Offset + 2];             // Rotanteil   
                            if (b > (r + g)) Count++;         // Sehr einfache Abfrage /bitte optimieren
                        }                    
                    }
                }
     
                pBild.UnlockBits(bmData);
                //MessageBox.Show(Count+""); 
                return Count;
            }
    (code tags von mod eingesetzt)

    Du solltest natürlich noch die Abfrage ob der Pixel als blau angesehen wird anpassen.
    Geändert von chmee (18.10.10 um 11:51 Uhr) Grund: code tags
     

  7. #7
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    Ist aber kein .net

    mfg chmee
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

  8. #8
    Avatar von 600emaster
    600emaster 600emaster ist offline Grünschnabel
    Registriert seit
    Jun 2005
    Ort
    55606 Kirn
    Beiträge
    3
    Es ist C# Code.

    Es ist doch .NET die Befehle für den Speicherzugriff (LockBits,UnlockBits) sind Teil des Frameworks.
    Die Pointerzugriffe Teil des C# Sprachumfang.
     

  9. #9
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    Ups, Sorry Dann nehme ich meine Aussage zurück.

    mfg chmee
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

  10. #10
    paul_meiz Tutorials.de Gastzugang
    @ 600emaster
    Danke für den code schnipsel
    bei if (b > (r + g)) Count++;
    werd ich wohl einen konstanten wert stat r + g nehmen, daher fällt denn auch die abfrage weck

    @ alle

    ich bin kein pro aber this.pictureBox1.Image is ja kein bitmap also müste ich's erst noch konvertieren oder?
    wie mach ich dass?
    wäre dankbar für nen code

    MFG

    Ps: Dannke an alle die sich meinem Problem annehmen
     

  11. #11
    paul_meiz Tutorials.de Gastzugang
    bekomme bei 600emaster's code noch den fehler:

    Error 1 The type or namespace name 'BitmapData' could not be found (are you missing a using directive or an assembly reference?) C:\Dokumente und Einstellungen\orlando\Desktop\Neuer Ordner\Webcam_Test\Form1.cs 206 13 Webcam_Test
     

  12. #12
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Image ist kein Bitmap, aber Bitmap ist ein Image. Du kannst aber über new Bitmap(Image) eine Umwandlung machen.
    Siehe dazu in der Dokumentation unter "Vererbungshierarchie"
    http://msdn.microsoft.com/de-de/libr...ing.image.aspx

    Hast du den Satz gelesen und es überprüft "are you missing a using directive or an assembly reference?".
    Siehe hier für den erforderlichen Verweise: http://msdn.microsoft.com/de-de/libr...itmapdata.aspx
     

  13. #13
    paul_meiz Tutorials.de Gastzugang
    OK habe ".Imaging" vergessen

    Das mit dem konvertieren hat ja Shakie schon gesagt, ich habs nur überlesen
    Peinlich :-P

    aber ich kriege noch den fehler

    Error 1 Unsafe code may only appear if compiling with /unsafe C:\Dokumente und Einstellungen\p-meiz\Desktop\blaupixeltest\Form1.cs 217 13 Webcam_Test

    Ich habs gelesen weiß aber net was "compiling with /unsafe" meint oder besser wie ich mit "/unsafe" compeliere!
    Ps: MVS 2008
     

  14. #14
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
     

  15. #15
    paul_meiz Tutorials.de Gastzugang
    Danke an alle!
    Leuft so weit und ist auch schnell genug.

    Im nachhinein ist mir aber aufgefallen, dass es schön wer, wenn jemand 600emaster's funktion so verändern könnte, dass auch ein bild ausgegebne wird, indem die gezählten pixel rot sind.
    gleichzeitig soll aber auch die anzahl ermittelt werden.

    Aber ich bin schon sehr glücklich das das zählen klapt, dass einfärben währ nur ein zusatz.
     

Ähnliche Themen

  1. Pixel zählen mit Visual Basic
    Von dumme nuss im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 19.04.08, 21:35
  2. Pixel zählen
    Von Kai Pflaume im Forum Photoshop
    Antworten: 2
    Letzter Beitrag: 28.11.07, 13:14
  3. pixel zählen, bei auswahl
    Von 61850n im Forum Photoshop
    Antworten: 15
    Letzter Beitrag: 20.02.06, 23:32
  4. bestimmte Pixel zählen in Bild
    Von Andreas S im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 02.11.04, 20:17
  5. Pixel auf dem Bildschärm zählen!
    Von Rustyaxe im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 09.09.03, 13:26