Gå til innhold

[Løst] Gjøre om fra HEX til JPEG, eller fra råformat til bilde


Anbefalte innlegg

Er ikke helt sikker på om dette er riktig forum, men jeg prøver meg.

 

Har et lite CMOS kamera som jeg har koblet til en mikrokontroller. Denne mikrokontrolleren leser dataene fra kameraet og sender dataene til min PC. I følge spesifikasjonene til kameraet så er det JPEG komperimering på kameramodulen.

 

Jeg får riktige start og slutt byte fra kameraet i følge JPEG standarden (http://en.wikipedia.org/wiki/JPEG) da de 2 første bytene er FF D8 og de 2 siste er FF D9 som indikerer "Start Of Image" og "End Of Image". Problemet er at jeg ikke får vist dette bildet i Windows. Har førsøkt å lese bildet i Matlab med imread(), men får feilmeldingene:

Warning: JPEG library error: Corrupt JPEG data: 44 extraneous bytes before marker 0xc4.

Warning: JPEG library error: Bogus Huffman table definition.
Måten jeg lager .jpg filene er at jeg åpner en hex editor og limer inn dataene jeg får fra mikrokontorlleren og lagrer dette som et .jpg bilde. Er dette riktig?
En annen ting også, kameraet kan også sende ukomprimerte data (Y4,Y8,RGB12,RGB16,RGB24,YUV16) men hvordan får jeg gjort om disse som bilder f.eks .jpg?
Databladet til kameramodulen finnes her:
Takker for alle svar!
Endret av Magnusha
Lenke til kommentar
Videoannonse
Annonse

Linken har to ekstra tegn på slutten som man må ta bort før den fungerer.

 

Jeg tror jeg har en modul med den chipen og jeg lagret bare dataene sånn som du nevner og jeg kan åpne bildene direkte i photoshop.

 

Det er mange ting som kan gjøre at dataene blir forandret på veien fra kameraet til fila. Du burde lage et program som åpner porten for binære data og skrive dataene direkte til en fil åpnet i binært modus.

 

Det kan være problemer med linjeendinger, kontrollkoder, endian osv... i tillegg til kopi og lim inn operasjonen.

 

Å komprimere til JPEG krever en relativt kraftig mikrontroller med en del RAM, det er en dårlig ide å prøve det før du vet at alt fungerer perfekt.

 

Prøv RGB24, det kan photoshop lese direkte. Hvis du ikke har noen programmer som kan vise bildet så poster du bare fila så er det alltids noen som fikser det.

Lenke til kommentar

 

Det er mange ting som kan gjøre at dataene blir forandret på veien fra kameraet til fila. Du burde lage et program som åpner porten for binære data og skrive dataene direkte til en fil åpnet i binært modus.

Enig med Kristallo at det er nok en fordel å lese dataene i binær modus fra kontrolleren. En copy/paste av binære data kan gjøre endringer på dataene.

Lenke til kommentar

 

Hvordan format bør jeg lagre det i?

 

Det er jo mange språk/rammeverk/bibliotek som har funksjon for å lagre både TIF og JPG (sikkert BMP også) hvis du vil ha det som en fil med standard format.

 

Det er ikke noe fasitsvar på hva du bør lagre det som, det spørs jo på bruksområdet senere, men hvis du ikek har noe i mot lossy komprimering er jo JPG et greit format som nesten alle program kan vise.

Lenke til kommentar

Det virker som du mangler et viktig komponent i opplegget ditt, nemlig Hex til Image konverterings software.

 

Du kan ikke regne med at noen vanlig foto redigerings program kan konvertere Hex til en brukbar kodek.

 

Det eneste du har er en data stream, men ingenting som tolker og render det til bilde informasjon.

 

Etter å ha prøvet filen i flere online data konverterere ser det ut som dataen din mangler viktige data URI for å kunne bli renderet som et bilde.

Alle analyse programmene jeg prøver sier at dette er ikke Image files.

 

Prøv selv;

http://dataurl.net/#dataurlmaker (hvis du ikke får bilde når du legger inn bilde dataen din her så har du ikke fullstendig bilde data)

 

 

http://www.percederberg.net/tools/text_converter.html

http://duri.me

PS; disse linkene går til online convertere som egentlig gjør det motsatte av det du ønsker.

Lenke til kommentar

Det virker som du mangler et viktig komponent i opplegget ditt, nemlig Hex til Image konverterings software.

 

Enig, legger man først data inn i tekst-filer er det sannsynlig at man mister noe så du trenger et program som tolker og lagrer data. Enten må du finne et program som gjør dette eller lage noe selv, trodde du holdt på med det siste? Uten å vite eksakt hva du gjør er det vanskelig å komme med råd.

 

Programmerer du selv så avhenger det av hvordan du får dataene ut fra kameraet. Leser du jpg-data ut fra en port må du enten lagre det binært rett til en fil eller lese en stream og rendre det i programmet ditt. Har du først data i et buffer i memory kan du bruke funskjoner i programmeringsspråket eller et bibliotek for å lagre buffer i det filformatet du ønsker. Det kan så leses inn i et editeringprogram hvor du sannsynligvis må legge på en gammakurve for å få et brukbart bilde (hvis ikke det gjøres autoamtisk av programmet).

 

Leser du RGB-data blir fremgangsmåten mye den samme, da kan du opprette et "tomt bilde" i programmet ditt og så sette piksel for piksel etter hvert som du leser datastrømmen. Det er lenge siden jeg har programmert noe slik så jeg husker ikke alle detaljer, men det bør ikke være spesielt vanskelig.

Lenke til kommentar

Hva slags programmeringspråk har du til kontrolleren din?

Selve mikrokontolleren bruker C. Sitter å prøver i Matlab nå med å få dataene inn der. Har fått Matlab til å lese fra COM-porten og får dataene, mener litt usikker på hva jeg skal gjøre med dem? Har forsøkt å lagre til .jpg med fwrite() kommandoen i matlab, men det hjalp ikke noe. Har du/dere noen forslag?

Lenke til kommentar

Jeg prøvde å konvertere Y8 fila men den ser ut til å være i bayerformat.

Når jeg plukker ut bare en av farvekanalene i det lille bildet så ser man klart at kameraet fungerer og bildet er ute av fokus.

 

RGB24 fila ser ut til å være i identisk bayerformat som Y8 så jeg mistenker at du ikke får valgt korrekt bildeformat.

 

Jeg antok at formatet i fila var heksadesimal, to ASCII tegn pr piksel.

post-13911-0-88598400-1383749874_thumb.png

post-13911-0-86974800-1383749885.png

Endret av Kristallo
  • Liker 1
Lenke til kommentar

Jeg sender ingenting til mikrokontrolleren. Den starter opp, sjekker om alt er i orden og spør etter et bilde. Deretter overføres bilde over USART til serieporten. I begynnelsen brukte jeg et terminalvindu hvor jeg fikk dataene rett inn, og kopierte dem inn i en hex-editor og lagret som .jpg. Nå har jeg forsøkt med Matlab hvor jeg lagrer bildene som både .jpg og som .bin. Dataene jeg mottar ser helt like ut som de filene over i matlab også ja.

Lenke til kommentar

Jeg prøvde å konvertere Y8 fila men den ser ut til å være i bayerformat.

Når jeg plukker ut bare en av farvekanalene i det lille bildet så ser man klart at kameraet fungerer og bildet er ute av fokus.

 

RGB24 fila ser ut til å være i identisk bayerformat som Y8 så jeg mistenker at du ikke får valgt korrekt bildeformat.

 

Jeg antok at formatet i fila var heksadesimal, to ASCII tegn pr piksel.

Hvordan fikk du til det? Hvilket program brukte du?

Lenke til kommentar

Jeg sender ingenting til mikrokontrolleren. Den starter opp, sjekker om alt er i orden og spør etter et bilde. Deretter overføres bilde over USART til serieporten. I begynnelsen brukte jeg et terminalvindu hvor jeg fikk dataene rett inn, og kopierte dem inn i en hex-editor og lagret som .jpg. Nå har jeg forsøkt med Matlab hvor jeg lagrer bildene som både .jpg og som .bin. Dataene jeg mottar ser helt like ut som de filene over i matlab også ja.

Slik jeg ser det, å ser det ut som om filene er rene textfiler med hex-koder og må dermed konverteres til binært format.

 

Jeg slengte sammet et C program; men det ble ikke JPEG fil for det ...

#include <stdio.h>
#include <stdlib.h>


void convert_file(char * in_file, char * out_file)
{
    FILE * inp;
    FILE * outp;

    inp = fopen(in_file, "r");
    outp = fopen(out_file, "wb");

    if ((inp != NULL) && (outp != NULL)) {
        char inbuf[3];
        char unsigned ch;

        inbuf[2] = '\0';

        while (fread(inbuf, 2, 1, inp) != 0) {
            ch = strtol(inbuf, NULL, 16);
            fwrite(&ch, sizeof(ch), 1, outp);
        }
        fclose(inp);
        fclose(outp);
    }

}


int main(int argc, char ** argv)
{
    if (argc != 3) {
        fprintf(stderr, "usage: %s infile outfile\n", argv[0]);
        exit(1);
    }

    convert_file(argv[1], argv[2]);

    return 0;
}
Lenke til kommentar

Jeg laget et program som tomsi42, det er fort gjort. Det mangler en byte i JPEG fila så du må prøve å lage en ny. Siden hver byte er beskrevet med et tosifret heksadesimalt nummer så må fillengden være delelig på to og det er den ikke. Siden JPEG fila slutter med rett markør så må det mangle en byte inne i fila noe sted.

Endret av Kristallo
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...