forked from freudenreichan/info2Praktikum-NeuronalesNetz
added ImageInput
This commit is contained in:
1 parent
c7937d6389
commit
647716ff66
1 file changed
+132
-1
+132
-1
@@ -7,16 +7,147 @@
|
||||
#define FILE_HEADER_STRING "__info2_image_file_format__"
|
||||
|
||||
// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei
|
||||
//Hilfsfunktion zum Einlesen eines einzigen Bildes
|
||||
static int read_single_image(FILE *file, unsigned short width, unsigned short height, GrayScaleImage *img, unsigned char *out_label)
|
||||
{
|
||||
size_t pixels_to_read = (size_t)width * height;
|
||||
|
||||
img->width = width; //save width and height read from file in struct
|
||||
img->height = height;
|
||||
|
||||
img->buffer = malloc(pixels_to_read * sizeof(GrayScalePixelType)); //allocating needed memory for pixel-buffer
|
||||
if(img->buffer == NULL) //Error case
|
||||
{
|
||||
printf("%s", "Fehler bei der Speicherreservierung!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if(fread(img->buffer, sizeof(GrayScalePixelType), pixels_to_read, file) != pixels_to_read) //read all pixels one after another
|
||||
{
|
||||
free(img->buffer); //Error case: free allocated memory
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if(fread(out_label, sizeof(unsigned char), 1, file) != 1) //read label
|
||||
{
|
||||
free(img->buffer); //Error case: free allocated memory
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen
|
||||
GrayScaleImageSeries *readImages(const char *path)
|
||||
{
|
||||
GrayScaleImageSeries *series = NULL;
|
||||
char buffer[BUFFER_SIZE];
|
||||
unsigned short num_images;
|
||||
unsigned short width;
|
||||
unsigned short height;
|
||||
|
||||
|
||||
|
||||
FILE *file = fopen(path, "rb");
|
||||
|
||||
if(file == NULL) //file can not be opened
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* VERIFY IF HEADER FILE IS INCLUDED
|
||||
********************************************************************************/
|
||||
fread(buffer, sizeof(buffer[0]), strlen(FILE_HEADER_STRING), file);
|
||||
buffer[strlen(FILE_HEADER_STRING)] = '\0';
|
||||
|
||||
if(strcmp(buffer, FILE_HEADER_STRING) != 0) //file does not include file header
|
||||
{
|
||||
fclose(file);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* READ AMOUNT, WIDTH, HEIGHT
|
||||
********************************************************************************/
|
||||
fread(&num_images, sizeof(num_images), 1, file);
|
||||
fread(&width, sizeof(width), 1, file);
|
||||
fread(&height, sizeof(height), 1, file);
|
||||
|
||||
|
||||
/*********************************************************************************
|
||||
* MEMORY ALLOCATION FOR SERIES
|
||||
********************************************************************************/
|
||||
GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries));
|
||||
if(series == NULL) //Error: memory cannot be allocated; close file
|
||||
{
|
||||
fclose(file);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
series->count = num_images; //save number of images in struct
|
||||
series->images = malloc(num_images * sizeof(GrayScaleImage)); //allocate memory for all images
|
||||
series->labels = malloc(num_images * sizeof(unsigned char)); //allocate memory for all labels
|
||||
|
||||
if(series->images == NULL || series->labels == NULL) //Error: memory cannot be allocated: free every memory
|
||||
{
|
||||
free(series->images);
|
||||
free(series->labels);
|
||||
free(series);
|
||||
|
||||
fclose(file);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************************
|
||||
* READ IMAGES
|
||||
********************************************************************************/
|
||||
|
||||
for(int i = 0; i < num_images; i++)
|
||||
{
|
||||
if(read_single_image(file, width, height, &series->images[i], &series->labels[i]) != 1)
|
||||
{
|
||||
series->count = i;
|
||||
|
||||
clearSeries(series); //free all allocated memory
|
||||
|
||||
fclose(file); //Error case: close file
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
|
||||
|
||||
|
||||
return series;
|
||||
}
|
||||
|
||||
// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt
|
||||
void clearSeries(GrayScaleImageSeries *series)
|
||||
{
|
||||
if(series == NULL) //pointer points to nothing; nothing to clear
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(series->images != NULL) //check if image pointer is valid
|
||||
{
|
||||
for(int i = 0; i < series->count; i++) //free memory allocated for all images until error occured
|
||||
{
|
||||
free(series->images[i].buffer);
|
||||
}
|
||||
free(series->images); //free memory allocated for image array
|
||||
}
|
||||
|
||||
if(series->labels != NULL) //check if label pointer is valid
|
||||
{
|
||||
free(series->labels); //free memory allocated for label array
|
||||
}
|
||||
|
||||
free(series); //free memory allocated for series
|
||||
}
|
||||
Reference in new issue
Block a user