Hallo!
Ich bastle momentan an einem Programm, womit ich Regionen in einem Schwarz/Weiss Bild erstellen und auflisten kann (verwende OpenCv zum einlesen und Bilder anzeigen).
Ich verwende selbstgeschriebene Klassen zum Speichern:
Die einfachste Klasse: Point2D(), die 3 Integer Werte für die X und Y Koordinate sowie den zugehörigen Grauwert.
Zudem gibt es eine Klasse Area, die ein Array von Point2D enthält. Diese Punkte sind somit in dieser „Area“ = Region enthalten.
Nun wollte ich von 256 Bildern alle Regionen (bis 100 Rgionen maximal) speichern, und habe ein Array
Area[256][100]
erstellt. Jedoch meint der Compiler (Dev-C++ 4.9.9.2), das Array sei zu groß.
Liegt dies eventuell an den Deklarationen?
Points2D.h
class Point2D {
public:
int x, y, gray;
Point2D(int,int);
Point2D();
Point2D(int,int,int);
int equal(Point2D\*);
void dump();
};
Area.h
#define MAX\_IMG\_WIDTH 640
#define MAX\_IMG\_HEIGHT 480
#define GRAY\_VALUES 256
class Area {
public:
/\*constructors\*/
Area(); //tested
Area(Point2D\*); //tested
/\*methods\*/
//is a Point inside the area?
int isInArea(Point2D\*); //tested
//is a Point neighbor to a Point inside the area?
int neighbor(Point2D\*); //tested
//add a Point to the area
int add(Point2D\*); //tested
//add multiple Points to the area
int add(Point2D\*[],int); //tested
//merging two areas
int merge(Area\*); //tested
//deleting a Point of the area
int del(Point2D\*); //necessary??
//returns a Point at given index \> 0
Point2D\* point(int); //tested
//returns the total number of points stored inside the area
int total(); //tested
//display all points within this area
void dump(); //tested
//display the area as an IplImage
void displayAsIplImg(CvSize,int);
//variables, how big the image is - makes it easier to search for specific Points
int img\_width;
int img\_height;
private:
/\*intern variables\*/
Point2D \*area[MAX\_IMG\_WIDTH][MAX\_IMG\_HEIGHT];
//how many points are inside the area?
int totalPoints;
/\*for faster indexing and retrieving points
stores how many points on a given x coordinate are stored in the area\*/
int pOnX[MAX\_IMG\_WIDTH];
//need to initialise the pOnX
void init();
};
Noch ein Wort zur Area-Klasse:
Meine Idee fürs schnellere durchsuchen der Area war, daß der erste Index einfach die x-Koordinate des Punktes ist und der nächste Punkt einfach dann weiter hintereinander gespeichert wird.
Um zu verfolgen, wieviele Punkte insgesammt bei einer bestimmten x-Koordinate gespeichert sind, existiert das pOnX Array (sizeof(area[x]) liefert leider nicht das zurück, was ich hoffte… ). Somit kann z.B. für den Test, ob ein Punkt (Point2D) in der Area liegt, mir relativ kleinem, linearem Aufwand durchgeführt werden.
Ich könnte mir vorstellen, daß ich den Arrays zu viel Speicher zugewiesen habe.
Aber ich weiss leider auch keine Abhilfe, denn man kann (soweit ich weiß), kein Array erstellen ohne ihm eine Größe zuzuweisen.
Ich hoffe, ich habe mich nicht zu konfus ausgedrückt und man kann mir folgen + helfen.
Grüße
Björn