Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » in Bitmaps rechecke finden...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
18.06.2008, 01:01 Uhr
~siddy
Gast


ich hab ein problem... und zwar bin ich grad eine aufgabe zu machen für die uni und komme nicht weiter.

Aufgabenstellung ist :
Zitat:

Es soll eine Anwendung erstellt werden, die eine Bilddatei einlesen, auswerten, verändern und speichern kann.....blablabla

blablabla...
Die Datei enthält ein grünes und ein rotes Rechteck, die sich nicht überlappen. Bestimmen Sie die Größe und die Position dieser Rechtecke... blablabla




es ist eine bmp datei grösse ist 640x480 pixel gross... und mein problem ist, ich weiss nicht wie ich die rechtecke finde und deren grösse bestimme
ok es wäre ziemlich einfach wenn ich einfach nur die farben analysiere aber sinn des programms ist es rechtecke zu finden nicht kreise oder sonst was auch wenn keine kreise vorhanden sind...

C++:
BYTE bild[bih.biHeight][bih.biWidth];


ungefähres beispiel vom inhalt des bild arrays ->

000000000000000000000000000
000055555000000000000000000
000055555000000000000000000
000055555000000000000000000
000000000000000000000000000
000000000333333333000000000
000000000333333333000000000
000000000333333333000000000
000000000000000000000000000





mein bisheriger code ->

Code:
#include <stdio.h>



typedef char                CHAR;
typedef short               SHORT;
typedef long                LONG;
typedef unsigned long       DWORD;
typedef int                 BOOL;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;


typedef struct tagBITMAPFILEHEADER {
  WORD    bfType;
  DWORD   bfSize;
  WORD    bfReserved1;
  WORD    bfReserved2;
  DWORD   bfOffBits;
} __attribute__((__packed__)) BITMAPFILEHEADER, *PBITMAPFILEHEADER;



typedef struct tagBITMAPINFOHEADER{
  DWORD  biSize;
  LONG   biWidth;
  LONG   biHeight;
  WORD   biPlanes;
  WORD   biBitCount;
  DWORD  biCompression;
  DWORD  biSizeImage;
  LONG   biXPelsPerMeter;
  LONG   biYPelsPerMeter;
  DWORD  biClrUsed;
  DWORD  biClrImportant;
} __attribute__((__packed__)) BITMAPINFOHEADER, *PBITMAPINFOHEADER;


typedef struct tagRGBQUAD {   // 8 bit
  unsigned char    rgbBlue;
  unsigned char    rgbGreen;
  unsigned char    rgbRed;
  unsigned char    rgbReserved;

} __attribute__((__packed__)) RGBQUAD;

typedef struct tagRGBTRIPLE {  // 24 bit
  unsigned char rgbtBlue;
  unsigned char rgbtGreen;
  unsigned char rgbtRed;
} RGBTRIPLE;



int main( void ){    

    int y = 0;
    int x=0;
    

  FILE* f;
  int rc;
  BITMAPFILEHEADER bfh;
  BITMAPINFOHEADER bih;

/***********  FILEOPEN & FILEREAD ************/
  printf("lese Bildinformationen...\n");
  f = fopen( "C:\\Unbenannt.bmp", "r" );
  if( f == 0 ){
    perror( "fopen" );
    return 1;
      }

  rc = fread( &bfh, 1, sizeof(BITMAPFILEHEADER), f );
  if( rc != sizeof(BITMAPFILEHEADER) ){
    perror( "fread bfh" );
    fclose(f);
    return 1;
  }

  rc = fread( &bih, 1, sizeof(BITMAPINFOHEADER), f );
  if( rc != sizeof(BITMAPINFOHEADER) ){
    perror( "fread bih" );
    fclose(f);
    return 1;
  }
/*********** Bildbearbeitung ************/
  
  BYTE bild[bih.biHeight][bih.biWidth];
  
  printf("Bilddimesion in Pixeln -> y: %d, x: %d\n", bih.biHeight, bih.biWidth);
  printf("Compression : %d\n",bih.biCompression); // kompression an / aus ? ausg
  printf("bfType : 0x%x\n",bfh.bfType);  // BF Type ausgabe
  
  /*lese daten aus der bilddatei ins array ein*/
  printf("lese daten aus der bilddatei ins array ein...");
  if (bih.biCompression == 0) {
          for (y = 0; y < bih.biHeight; y++) {
              rc = fread( &bild[bih.biHeight-y-1], 1, bih.biWidth, f);              
              if (rc != bih.biWidth) {
                  perror("fread bild");
                  fclose(f);
                  return 1;
              }
          }
      }
  printf("einlesen fertig\n");
/*ende einlesen... */
  /*rechtecke identifizieren*/
  printf("rechtecke bestimmen...\n");


              
  
  
/***********  Bildbearbeitung ende ************/
/*********** FILEWRITE   ************/ /**/

  
  rc = fwrite( &bfh, 1, sizeof(BITMAPFILEHEADER), f);
    if (rc != sizeof(BITMAPFILEHEADER)) {
        perror("fwrite bitmap file header");
        fclose(f);
        return 1;
    }

    rc = fwrite( &bih, 1, sizeof(BITMAPINFOHEADER), f);
    if (rc != sizeof(BITMAPINFOHEADER)) {
        perror("fwrite bitmap info header");
        fclose(f);
        return 1;
    }
/****************************************/
  fclose(f);

  return 0;
}



wie könnte man denn da weitermachen ??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.06.2008, 09:24 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Also hab mir deinen Code jetzt nicht angeschaut, aber eine Möglichkeit wäre es doch das du das Bild Zeile für Zeile untersuchst bis du einen roten oder grünen Pixel findest. Dann zählst du wieviele solche Pixel in der Zeile noch folgen und springst dann in die nächste Zeile an die selbe Position wo in der Zeile vorher der erste Pixel davon war. Da prüfst du dann ob der aktuelle die selbe Farbe hat, der vorherige eine andere und ob noch genau so viele Pixel folgen wie in der Zeile darüber. Das machst du dann so lange bis in einer Zeile an der 1. Position kein solcher Pixel mehr kommt und wenn in allen geprüften Zeilen gleich viele Pixel der Farbe waren dann hast du ein Rechteck gefunden...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.06.2008, 11:30 Uhr
~siddy
Gast


@ guybrush : das hab ich letzte nacht auch gedacht... leider funktioniert das nur teilweise - weil sobald ein pixel am rand (1.position -1 )zusätzlich vorkommt, ist es kein rechteck mehr... oder
oder z.B. in der untersten zeile des "rechtecks" paar pixel in der selben farbe mehr oder weniger vorhanden sind.-.. es muss leider ein perfektes rechteck ergeben...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.06.2008, 15:00 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ich verstehe immer noch nicht so ganz die Aufgabenstellung. Sollst du nun "nur" perfekte Rechtecke (und zwar solche die im Bild auch "günstig" rechtwinklig und pixelgenau" angeordnet sind) finden oder alles was ein Rechteck sein könnte?
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 18.06.2008 um 15:16 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.06.2008, 15:20 Uhr
xXx
Devil


darf es nicht gedreht sein usw?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.06.2008, 15:49 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von ~siddy:
@ guybrush : das hab ich letzte nacht auch gedacht... leider funktioniert das nur teilweise - weil sobald ein pixel am rand (1.position -1 )zusätzlich vorkommt, ist es kein rechteck mehr... oder
oder z.B. in der untersten zeile des "rechtecks" paar pixel in der selben farbe mehr oder weniger vorhanden sind.-.. es muss leider ein perfektes rechteck ergeben...

Da schließ ich mich dann Windalf an, welche sollst du denn nun finden?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.06.2008, 22:38 Uhr
~siddy
Gast


es sind 2 bilddateien mit 2 perfekten rechtecken ( verschieden farbig) eine bilddatei ist weisser hintergrund und 2 zweifarbige rechtecke und die zweite bilddatei hat schriftzüge integriert...


hier eines der bilder ->
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.06.2008, 22:40 Uhr
~siddy
Gast


ups hier nochmal das bild ->





http://img367.imageshack.us/img367/6040/unbenanntul3.th.png
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.06.2008, 23:42 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Na aber dann kannst du es doch wie oben beschrieben machen.
Ansonsten könntest du bei der Methode ja mit einer gewissen Toleranz arbeiten, also wenn der Pixel gleich der andere Pixel +- ein bischen bei den einzelnen RGB Werten...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
18.06.2008, 23:54 Uhr
Lensflare



Du könntest so vorgehen wie von Guybrush Threepwood vorgeschlagen, aber noch zusätzlich bei jeder Zeile prüfen, ob (erste position - 1) und (letzte position + 1) die selbe farbe hat wie die farbe des rechtecks das du gerade scannst. Und wenn eines dieser Pixel die selbe farbe hat, dann ist es kein rechteck.

Nochmals zusammengefasst:
- pixel für pixel nach dem ersten roten oder grünen pixel suchen (die stelle in der Zeile sei P).
- zählen, wie viele gleichfarbige pixel nach rechts folgen (anzahl sei X).
- die unteren zeilen prüfen ob sie ab der stelle P auch X viele gleichfarbige pixel haben und ob die pixel am rechten und linken rand nicht diese farbe haben
- wenn man auf eine zeile trifft, die ab der stelle P keinen einzigen pixel der gesuchten farbe hat, dann hat man ein rechteck gefunden.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 18.06.2008 um 23:57 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: