PROBLEMA [C] non trovo il problema con il codice!

valeriomoltoserio

Nuovo Utente
1
0
ciao a tutti, devo scrivere un programma per un esame di elaborazione di immagini e non riesco a capire perchè il programma non legge i file in formato .raw

Se qualcuno mi sa consigliare ne sarei molto grato.

di seguito il codice:

#include <errno.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>


int rows,cols,masksize;
unsigned char **img1,**img2,**img3,**img_o,**img_o2,**img_o3;
DIR *pdir;
struct dirent *pent;
int Lind=100; //100 è la max lunghezza dell'indirizzo. Si può aumentare se necessario

//DICHIARAZIONI FUNZIONI
long scandir(char *ind);
unsigned char** allocabuffer(int r, int c);
int** allocaintbuffer(int r, int c);
double** allocadoublebuffer(int r, int c);
void eliminabuffer(unsigned char **buffer,int r);
void eliminaintbuffer(int **buffer,int r);

void readraw(char *filepath,unsigned char **buffer);
void readrawRGB(char *filepath,unsigned char **R,unsigned char **G,unsigned char **B);
double* hist(unsigned char **buffer,char *filepath); //modificato con aggiunta indirizzo ((, char *indirizzo))

unsigned char** sobel (unsigned char **img,int th,int method);
unsigned char** orlatura(unsigned char **buffer,int rows,int cols,int size);


FILE *out;

int main()
{

char ind[60]; // var per l'indirizzo della cartella. Modificare dimensione se il path è molto lungo
rows=255; cols=255; // DA MOD SE SI VOGLIONO CERCARE IMMAGINI PIù GRANDI
int arri=0; // index per il popolamento di arr
long count=0;
long i=0;


img1=allocabuffer(rows,cols);
/* img2=allocabuffer(rows,cols);
img3=allocabuffer(rows,cols);*/

/*Inserimento indirizzo cartella foto*/
printf("**Inserimento indirizzo cartella foto**\n");
printf("Per inserire correttamente un percorso e\' necessario \'raddoppiare\' gli \'slash\'! (es: C:\\\\eiv\\\\foto)\n");
printf("\n\nInserisci il percorso della cartella: ");
scanf("%s", &ind);

count=scandir(ind); //legge la directory, crea un file con tutti gli indirizzi, conta le immagini
printf("\nLa directory %s contiene %d immagini",ind,count);


char arr[count][Lind];

readraw(ind,img1);

char *Parr=&arr[count][Lind];

***Creazione array indirizzi foto****


char arr[count][110]; // array per indirizzi foto
FILE *fd;
tenta di aprire in lettura il file images.xls
if (!(fd=fopen("C:\\eiv\\images.xls","r"))) {
printf("Errore in apertura");
return 1;
}
while (!feof(fd)){
prelevo la riga dal file
if(i<=count) {
fgets(arr, 100, fd); i++;
}
//if(f==0) {strcpy(ind2,buf2); fscanf(fd, "%d", &hist2[f]);}
//else if (f>0) {fscanf(fd, "%d", &hist2[f]);}
//if(f==256) {
}
/****Fine Creazione array indirizzi foto****/


/*Prova creazione istogramma
for(i=0;i<=count;i++)
{ readraw(arr,img1);
hist(img1,"C:\\eiv\\histP2.xls");
} */


//cleanbuffs
eliminabuffer(img1,rows);
/* eliminabuffer(img2,rows);
eliminabuffer(img3,rows);*/


fflush(stdin);
getchar();
}
/****************************Fine Main*************************************/



/*************************FUNZIONI******************************************/

unsigned char** allocabuffer(int r, int c)
{
int i;
unsigned char **buffer=(unsigned char**)
malloc(r*sizeof(unsigned char*));
for(i=0;i<r;i++)
buffer=(unsigned char*)calloc(3*c,sizeof(unsigned char));
return (buffer);
}

int** allocaintbuffer(int r, int c)
{
int i;
int **buffer=(int**)malloc(r*sizeof(int*));
for(i=0;i<r;i++)
buffer=(int*)calloc(c,sizeof(int));
return (buffer);
}

double** allocadoublebuffer(int r, int c)
{
int i;
double **buffer=(double**)malloc(r*sizeof(double*));
for(i=0;i<r;i++)
buffer=(double*)calloc(c,sizeof(double));
return (buffer);
}

void readraw(char *filepath,unsigned char **buffer)
{
int i,j;
//FILE *o=fopen("C:\\test.xls","w");
FILE *source=fopen(filepath,"rb");
for(i=0;i<rows;i++)
{
fread(buffer,1,cols,source);
//for(j=0;j<cols;j++) fprintf(o,"%d\t",buffer[j]);
//fprintf(o,"\n");
printf("%d %d", &rows, &cols);
}
fclose(source);
}

void readrawRGB(char *filepath,unsigned char **R,unsigned char **G,unsigned char **B)
//read RGB interleaved image and fills 3 buffers
{
int i,j;
FILE *source=fopen(filepath,"rb");
for(i=0;i<rows;i++)
for(j=0;j<cols;j++)
{
fread(&R[j],1,1,source);
fread(&G[j],1,1,source);
fread(&B[j],1,1,source);
}
fclose(source);
}

void eliminabuffer(unsigned char **buffer,int r)
{
int i;
for(i=0;i<r;i++) free(buffer);
free(buffer);
}

void eliminaintbuffer(int **buffer,int r)
{
int i;
for(i=0;i<r;i++) free(buffer);
free(buffer);
}


//////////////// istogramma ///////////////////////////

double* hist(unsigned char **buffer,char *filepath)
{
int i,j;
unsigned long hist[256]={0};
double *o;
FILE *outhist=fopen(filepath,"a");

o=(double*)malloc(256*sizeof(double));
for(i=0;i<rows;i++) for(j=0;j<cols;j++) hist[buffer[j]]++;


for(i=0;i<256;i++)
{
o=(double)(hist)/(rows*cols);
fprintf(outhist,"%d\t%d\t%f\n",i,hist);
}
fclose(outhist);
return o;
}

////////////// edge detection ////////////

unsigned char** sobel (unsigned char **img,int th,int method)
{
int i,j,l,k;
float module,v,h;
int mask1[3][3]={{-1,0,1},{-2,0,2},{-1,0,1}};
int mask2[3][3]={{1,2,1},{0,0,0},{-1,-2,-1}};
unsigned char **temp=orlatura(img,rows,cols,3);
unsigned char**out_map=allocabuffer(rows,cols);

for(i=1;i<rows+1;i++)
for(j=1;j<cols+1;j++)
{
h=v=0;
for(l=-1;l<=1;l++)
for(k=-1;k<=1;k++)
{
h=h+(float)((temp[i+l][j+k])*mask1[1+l][1+k]);
v=v+(float)((temp[i+l][j+k])*mask2[1+l][1+k]);
}
module=sqrt(v*v+h*h);
if(module>255) module=255;
switch(method)
{
case 0: out_map[i-1][j-1]=module; break;
case 1: if(module>=th) out_map[i-1][j-1]=255; break;
case 2: if(module>=th) out_map[i-1][j-1]=module; break;
}
}

eliminabuffer(temp,rows+2);
return out_map;
}

/*scansione directory, creazione file image.xls e conteggio file*/
long scandir(char *ind)
{
long count=0; //conta il n° immagini

pdir=opendir(ind); // Apre l'indirizzo immesso. Se vogliamo che apra la dir corrente si usi "."
if (!pdir){
printf ("opendir() failure; terminating");
exit(1);
}
errno=0;

FILE *o=fopen("C:\\eiv\\images.xls","w"); // apre (crea) il file.

while ((pent=readdir(pdir))){
//printf("%s\n", pent->d_name); //stampa a video (prova!!)
if ((strcmp(pent->d_name,".")!=0) && (strcmp(pent->d_name,"..")!=0)) //verifiche contro la stampa dei punti!
{ fprintf(o,"%s\\\\%s\n",ind,pent->d_name); //scrive su file l'elenco delle immagini nella directory
count++; //conta le immagini
}
//strcpy(arr[arri],pent->d_name); arri++; //popola arr
}
if (errno) {
printf ("readdir() failure; terminating");
exit(1);
}

fclose(o); //chiude il file
closedir(pdir); //chiude la directory

return count;

/*FINE scansione directory, creazione file image.xls e conteggio file*/
}

unsigned char** orlatura(unsigned char **buffer,int rows,int cols,int size)
{
//FILE *source=fopen("test_orlatura.raw","wb");
int i,j;
unsigned char **out=allocabuffer(rows+size-1,cols+size-1);

for(i=size/2;i<rows+size/2;i++) for(j=size/2;j<cols+size/2;j++) out[j]=buffer[i-size/2][j-size/2];
for(i=0;i<size/2;i++)
{
for(j=0;j<size/2;j++) out[j]=buffer[size/2-i-1][size/2-j-1];
for(j=size/2;j<cols+size/2;j++)
{
out[j]=buffer[size/2-i-1][j-size/2];
out[rows+size/2+i][j]=buffer[rows-i-1][j-size/2];
}
for(j=cols+size/2;j<cols+size-1;j++) out[j]=buffer[size/2-i-1][2*cols+size/2-j-1];
}
for(i=size/2;i<rows+size/2;i++) for(j=0;j<size/2;j++)
{
out[j]=buffer[i-size/2][size/2-j-1];
out[cols+size/2+j]=buffer[i-size/2][cols-j-1];
}
for(i=rows+size/2;i<rows+size-1;i++)
{
for(j=0;j<size/2;j++) out[j]=buffer[2*rows+size/2-i-1][size/2-j-1];
for(j=cols+size/2;j<cols+size-1;j++) out[j]=buffer[2*rows+size/2-i-1][2*cols+size/2-j-1];
}

//test orlatura
//for(i=0;i<rows+size-1;i++) fwrite(out,1,cols+size-1,source); fclose(source);

return out;
}
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili