Διάβασμα raw δεδομένων σε unsigned char και έπειτα σε float.

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Διάβασμα raw δεδομένων σε unsigned char και έπειτα σε float.

Δημοσίευσηαπό Lokzor » 13 Νοέμ 2012, 00:09

Γεια σας,

προσπαθώ να δημιουργήσω ένα πρόγραμμα το οποίο θα διαβάζει μία εικόνα raw τύπου, θα την αποθηκεύει σε έναν πίνακα unsigned char και έπειτα θα πρέπει να τον μετατρέψει σε float. Επίσης θέλω να διαβάζει μετά, ανά 8 και να τα αποθηκεύει σε κελιά float πάλι διαφορετικού πίνακα 8 * 8.

Μορφοποιημένος Κώδικας: Επιλογή όλων
int fromdisk(char imfile[],image a,int ND1,int MD1,int N,int M)
/* Subroutine to read an image from a disk file.
imfile: OS file name (string)
a: image array of dimensions N,M
ND1,MD1: starting point on the buffer a
N,M: image dimensions in the file imfile */
{ FILE *fp;
unsigned char * buc;
int i,j;
if (a==NULL) return(-1);
if(N<0 || M<0 || N>NMAX || M>MMAX) return(-21);
if(ND1<0 || MD1<0 || ND1+N>NMAX || MD1+M>MMAX)
return(-22);
if((fp=fopen(imfile,"rb"))==NULL) return(-300);
buc=(unsigned char *)
malloc((unsigned int)M*sizeof(unsigned char));
if(buc==NULL) return(-10);
for(i=0; i<N; i++)
{ fread(buc,sizeof(unsigned char),M,fp);
for(j=0; j<M; j++) a[i+ND1][j+MD1]=buc[j];
}
free(buc); fclose(fp);
return(0);
}

main(int argv,char *argc[]){

int l,i,j;

unsigned char **imgMatrix;
float **imgflMatrix,**dctMatrix;
image A;

A=matuc2(512,512);
imgMatrix=matuc2(512,512); // η matuc2 kai η matf2 είναι απλά αρχικοποιήσεις των πινάκων με χρήση μίας συνάρτησης.
imgflMatrix=matf2(512,512);
dctMatrix=matf2(8,8);

l=fromdisk(argc[1],imgMatrix,0,0,512,512); // η fromdisk διαβάζει την εικόνα σε μορφή raw και την βάζει στον πίνακα imgMatrix τύπου unsigned char

for(i=0;i<512;i++)
for(j=0;j<512;j++)
imgflMatrix[i][j] = (float) imgMatrix[i][j];
Lokzor
babeTUX
babeTUX
 
Δημοσιεύσεις: 9
Εγγραφή: 23 Μαρ 2010, 00:02
Εκτύπωση

Re: Διάβασμα raw δεδομένων σε unsigned char και έπειτα σε fl

Δημοσίευσηαπό simosx » 13 Νοέμ 2012, 00:40

Lokzor έγραψε:
προσπαθώ να δημιουργήσω ένα πρόγραμμα το οποίο θα διαβάζει μία εικόνα raw τύπου, θα την αποθηκεύει σε έναν πίνακα unsigned char και έπειτα θα πρέπει να τον μετατρέψει σε float. Επίσης θέλω να διαβάζει μετά, ανά 8 και να τα αποθηκεύει σε κελιά float πάλι διαφορετικού πίνακα 8 * 8.


Πρόκειται για αυτό το είδους http://en.wikipedia.org/wiki/Raw_image_format ;
Αν ναι, τότε κάθε φωτογραφία RAW έχει διαφορετικό πρότυπο και εσωτερικές δομές. Για ποια κάμερα ενδιαφέρεσαι;
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Διάβασμα raw δεδομένων σε unsigned char και έπειτα σε fl

Δημοσίευσηαπό Lokzor » 13 Νοέμ 2012, 00:51

simosx έγραψε:
Lokzor έγραψε:
προσπαθώ να δημιουργήσω ένα πρόγραμμα το οποίο θα διαβάζει μία εικόνα raw τύπου, θα την αποθηκεύει σε έναν πίνακα unsigned char και έπειτα θα πρέπει να τον μετατρέψει σε float. Επίσης θέλω να διαβάζει μετά, ανά 8 και να τα αποθηκεύει σε κελιά float πάλι διαφορετικού πίνακα 8 * 8.


Πρόκειται για αυτό το είδους http://en.wikipedia.org/wiki/Raw_image_format ;
Αν ναι, τότε κάθε φωτογραφία RAW έχει διαφορετικό πρότυπο και εσωτερικές δομές. Για ποια κάμερα ενδιαφέρεσαι;


Η φωτογραφία είναι RAW, grayscale, ας πούμε bull.raw. Αν την μετατρέψω σε pgm ας πούμε με την εντολή, rawtopgm 512 512 bull.raw > bull.pgm μου βγάζει έναν ταύρο. Δεν ενδιαφέρομαι για κάποια κάμερα, είναι καθαρά προγραμματιστικός ο σκοπός μου. Μέσα το raw έχει κάτι τέτοιο: ’’’‘’£‘¦’’ ›£ ›œ‘‘šœš™š˜œššœšž› ž§ ¦¦₯¦¬«―­ͺ¬¬§―¨§’‘“”™Œ‚wvjaa^\Xag`heiiiihnnlkihmmmljjlnmkmmnnlhjjlmovoqvywpzyz}zy|{‚{z„ƒ„‡€ƒƒ‡‰„†ƒƒ€‚†~~…‚ƒ€ƒ€‡…ˆ†€†‚‡……†‡„‡.

Εγώ θέλω να πάρω αυτό να το αναθέσω σε έναν πίνακα unsigned char[512][512]. Έπειτα να τον μετατρέψω όλο σε float, και μετά να το χωρίσω σε block 8 x 8, και να το βάλω σε έναν άλλο πίνακα.
Lokzor
babeTUX
babeTUX
 
Δημοσιεύσεις: 9
Εγγραφή: 23 Μαρ 2010, 00:02
Εκτύπωση

Re: Διάβασμα raw δεδομένων σε unsigned char και έπειτα σε fl

Δημοσίευσηαπό simosx » 13 Νοέμ 2012, 01:49

Lokzor έγραψε:
Η φωτογραφία είναι RAW, grayscale, ας πούμε bull.raw. Αν την μετατρέψω σε pgm ας πούμε με την εντολή, rawtopgm 512 512 bull.raw > bull.pgm μου βγάζει έναν ταύρο. Δεν ενδιαφέρομαι για κάποια κάμερα, είναι καθαρά προγραμματιστικός ο σκοπός μου. Μέσα το raw έχει κάτι τέτοιο: ’’’‘’£‘¦’’ ›£ ›œ‘‘šœš™š˜œššœšž› ž§ ¦¦₯¦¬«―­ͺ¬¬§―¨§’‘“”™Œ‚wvjaa^\Xag`heiiiihnnlkihmmmljjlnmkmmnnlhjjlmovoqvywpzyz}zy|{‚{z„ƒ„‡€ƒƒ‡‰„†ƒƒ€‚†~~…‚ƒ€ƒ€‡…ˆ†€†‚‡……†‡„‡.

Εγώ θέλω να πάρω αυτό να το αναθέσω σε έναν πίνακα unsigned char[512][512]. Έπειτα να τον μετατρέψω όλο σε float, και μετά να το χωρίσω σε block 8 x 8, και να το βάλω σε έναν άλλο πίνακα.


Είναι άλλο αυτό που αναφέρεις εσύ. Αυτό το RAW είναι ειδική μορφή, κάτι σαν το αρνητικό των φίλμ, αλλά για ψηφιακές κάμερες.

Οπότε, αυτό που βλέπεις μέσα στο αρχείο ως ’’’‘’£‘¦’’ ›£ ›œ‘‘šœš™š˜œššœšž› ž§ ¦¦₯¦¬«―­ͺ¬¬§―¨§’‘“”™Œ‚wvjaa^\Xag`heiiiihnnlkihmmmljjlnmkmmnnlhjjlmovoqvywpzyz}zy|{‚{z„ƒ„‡€ƒƒ‡‰„†ƒƒ€‚†~~…‚ƒ€ƒ€‡…ˆ†€†‚‡……†‡„‡ είναι η απεικόνιση των δυαδικών δεδομένων σε μορφή UTF-8. Θα ήταν καλύτερα να δεις το αρχείο ως αρχείο με byte, π.χ. μέσω της εντολής hexdump.
Μπορείς να διαβάσεις το αρχείο σε πίνακα unsigned char. Και μπορείς να μετατρέψεις σε άλλες μορφές.
Ωστόσο διαβάζεις το αρχείο ως δυαδικό και όχι ως κείμενο.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Διάβασμα raw δεδομένων σε unsigned char και έπειτα σε fl

Δημοσίευσηαπό Lokzor » 13 Νοέμ 2012, 02:19

simosx έγραψε:
Είναι άλλο αυτό που αναφέρεις εσύ. Αυτό το RAW είναι ειδική μορφή, κάτι σαν το αρνητικό των φίλμ, αλλά για ψηφιακές κάμερες.

Οπότε, αυτό που βλέπεις μέσα στο αρχείο ως ’’’‘’£‘¦’’ ›£ ›œ‘‘šœš™š˜œššœšž› ž§ ¦¦₯¦¬«―­ͺ¬¬§―¨§’‘“”™Œ‚wvjaa^\Xag`heiiiihnnlkihmmmljjlnmkmmnnlhjjlmovoqvywpzyz}zy|{‚{z„ƒ„‡€ƒƒ‡‰„†ƒƒ€‚†~~…‚ƒ€ƒ€‡…ˆ†€†‚‡……†‡„‡ είναι η απεικόνιση των δυαδικών δεδομένων σε μορφή UTF-8. Θα ήταν καλύτερα να δεις το αρχείο ως αρχείο με byte, π.χ. μέσω της εντολής hexdump.
Μπορείς να διαβάσεις το αρχείο σε πίνακα unsigned char. Και μπορείς να μετατρέψεις σε άλλες μορφές.
Ωστόσο διαβάζεις το αρχείο ως δυαδικό και όχι ως κείμενο.


Οκ, ευχαριστώ νομίζω πως το κατάφερα. Τώρα ας πούμε ότι έχουμε έναν πίνακα unsigned char[512][512] ή έναν πίνακα float [512][512] πως μπορούμε να τους μετατρέψουμε σε μπλοκ 8 x 8 , ώστε να μας βγει ένας πίνακας ας πούμε new[8][8];

Δηλαδή αν θεωρήσουμε ότι έχουμε ένα bit σε κάθε κελί του unsigned char, πώς μπορώ να διαβάσω ανά 8 και να τα τοποθετήσω σε ένα κελί;
Lokzor
babeTUX
babeTUX
 
Δημοσιεύσεις: 9
Εγγραφή: 23 Μαρ 2010, 00:02
Εκτύπωση

Re: Διάβασμα raw δεδομένων σε unsigned char και έπειτα σε fl

Δημοσίευσηαπό simosx » 13 Νοέμ 2012, 02:24

Lokzor έγραψε:
Οκ, ευχαριστώ νομίζω πως το κατάφερα. Τώρα ας πούμε ότι έχουμε έναν πίνακα unsigned char[512][512] ή έναν πίνακα float [512][512] πως μπορούμε να τους μετατρέψουμε σε μπλοκ 8 x 8 , ώστε να μας βγει ένας πίνακας ας πούμε new[8][8];

Δηλαδή αν θεωρήσουμε ότι έχουμε ένα bit σε κάθε κελί του unsigned char, πώς μπορώ να διαβάσω ανά 8 και να τα τοποθετήσω σε ένα κελί;


Έχεις 8 byte με διάφορες τιμές και θέλεις να τα βάλεις σε μια μεταβλητή long float (8 byte);
Χρησιμοποιείς union, π.χ.

union mystringfloat
{
char bytes[8];
double f;
};

Θέτεις το bytes[] με τα 8 byte και μετά ανασύρεις την τιμή στο f.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση


Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι