En kartong televisor (med arduino och lysdioder) (11 / 14 steg)
Steg 11: Konvertera bilder till ljud!
För att spela något på televisor, en bild (film består av separata bilder) måste anpassas till varierande låg intensitet av lysdioder inuti televisor.
Som varje hål igenom fönstret, bestämmer varierande intensitet av lysdioderna intensiteten på just den platsen var ett hål ligger just nu. Bilden är bildad rad för rad.
Jag har redan sagt att intensiteten av lysdioderna kommer att kontrolleras som en ljudenhet. Detta är bara helt enkelt ljud kommer från hörlursuttaget på min laptop till en förstärkare till LED. (mer om det senare)
Så behöver programmet konvertera vithet av raderna till en spänning i audioutgången på min laptop.
I princip en fil måste skapas och spelade, det är så enkelt.
För att göra detta, en bild tas och indelad i 24 kolumner (var och en representerar ett hål som passerar genom fönstret). Varje rad är sedan omvandlas till en gråskala bild.
Vithet eller intensitet beräknas så här:
Varje pixel har en röd, grön och blå värde, tillsammans bildar de den specifika färgen du se. För att konvertera dessa röda, uppfattas gröna och blå värden till den allmänna intensiteten från ögat, används följande formel:
intensitet = 0,29 * röd + 0.71 * grön + 0.08 * blå.
Detta beror på att ögat känslighet varierar för olika färger. (Även notera att det finns 2 formler i wikipedia-artikeln, men sedan kom jag på den andra en det mesta, som är den jag använder. Och det bestämdes för användning i TV så det är mest lämpligt (men det spelar ingen roll som en av två används, det finns inte mycket skillnad)
Obs att jag omedelbart lagrar intensiteten i en array "shorts" beror på att en kort är 2 byte eller 16 bitar lång vilket är den resolution som jag använder för min wav-fil.
Nu finns det 24 matriser av stödnivåer som måste sättas i en WAV-fil. Beroende på prov hastighet, är dessa matriser i papperskorgen.
T.ex. att bygga min WAV-fil, jag vill spela det på en prov hastighet på 44100 Hz vilket är den vanligaste samplingsfrekvensen. Och skivan tar 1/12 sekunder att kretsa. Och varje hål igenom fönstret under den period som skivan ska rotera 14.8 grader, så en 14,8/360 del av en rotation. Så, helt enkelt följande formel används:
amount_bins = SPS * (Rotationperiod) * (del av rotation ett hål syns)
Detta uppgår till 151 (rundad) lagerplatser i mitt fall.
Så, enkelt uttryckt, bilden är nu uppdelad i 151 rader och 24 kolumner. Och alla delar är genomsnitt internt så du hamnar med en gråskala bild 24 av 151 pixlar.
Från denna konverterade bilden 24 rader (var och en en siffermatris 151) sedan sys ihop efter varandra att bilda en matris med 24 * 151 = 3624 nummer eller prover. När dessa data sätts i WAV-fil, kommer det spela upp ljudet som behövs för att producera en bild.
MEN, en rotation av skivan tar 1/12 av en sekund och med en frekvens på 44100 Hz detta står att 3675 prover. Så, ser du att det finns 51 nummer inte används. Och detta är helt bra eftersom det är bara den lilla bit av oanvänt utrymme på skivan om du tittar på mallen hålet positioner på en av de första stegen.
Detta är i princip alla viktiga saker.
Uppgifterna är nu helt enkelt i en WAV-fil. Jag hänvisar till denna sida på WAV ljudfil format att veta i detalj arrangemangen för byte. Du känner tydligt igen allt från sidan i funktionen makeWav() (och printInfo() fuction) i filen "wavreader.cpp". Jag bara helt enkelt binära ut alla saker de säger.
Vad du sluta med är en ljudfil. Om skivan från televisor är spunnen upp till rätt hastighet och ljudfilen spelas (löpande en 1000 gånger för enkel) och sedan bilden kan ses tydligt skumma över skärmen.
Så, först och främst för själva programmet jag använder Magick ++ eftersom ImageMagick är otroligt kraftfull och lätt att använda. Det gladde mig mycket att det också gav en bild redigerande bibliotek för C++ kallas Magick ++.
Alla läsa och skriva av pixlar var klar med detta bibliotek. Det finns en hel del förklaring om hur du installerar och använder den på deras huvudsidan för linux, mac och windows.
För det andra jag en gammal liten bit torsk som jag har skrivit för länge sedan. Jag ville läsa data från en WAV-fil så jag skrev en wavreader. Se upp att det är några smutsiga kod (kom ihåg varningar). Det är en blandning av C och C++, det fungerar bra men det är inte rätt.
Problemet var (och är fortfarande) som jag inte vet hur jag kan ha en fstream som medlem i en klass. Eller något lätt att permanent minns vad placera det på i en fil. Så jag gick C stil och används en enkel fil pekare.
Så, jag använder Linux och detta är kommandot kompilera som fungerar:
g ++-O3 -o bild main.cpp wavreader.cpp "Magick ++-config--cppflags--cxxflags--ldflags--libs'
(om du prova det, du ser 3 varningar att några returnera värden ignoreras, det är inte att dåligt, bara lösa dem lägger till några (för mig) värdelösa saker till vissa riktigt små funktioner). (och - O3 är lite för hastighet, men det spelar ingen roll eftersom jag inte har provat detta program med stora partier av bilder)
Naturligtvis kan du använda din favorit GUI bara se upp att det inte är en normal flagga. Jag har aldrig sett detta tidigare, men Magick ++-config är något som automatiskt skriver ut flaggor därav den "" symboler.
Och i qtCreator har du till exempel lägga till denna rad i filen pro:
QMAKE_CXXFLAGS += $$ system (magiska ++-config--cxxflags--cppflags)
(vilket är konstigt, det är därför jag gjorde det det i Codeblocks där du kan bara lägga till saker bokstavligen som det visas i kommandot kompilera)
Att faktiskt använda programmet skriver du bara:
. / bild Saturn.jpg
(som är i mitt fall
från wikipedia) Efter en kvart av en sekund eller så returneras bilden ovan sidan med ljudfilen (nedan).
Titta på bilden av ljudfilen i ljud, kan du tydligt erkänna den vänstra sidan av ringen i de dubbla topparna! (Saturn.wav)
Om du ger två bilder som argument, programmet stygn dem tillsammans automatiskt: (och namn WAV som första argument)
t.ex.
. / bild Saturn.jpg face.jpg
(ansiktet var som från René från ' Allo ' Allo!)
Detta ger sedan efter wav-fil: (igen heter Saturn.wav)
Men för att demonstrera funktionerna i denna lilla program låter undersöka detta gif: (fick den från här)
Du kan sedan få med Imagemagick alla separata ramar. Om du placera dem i en mapp och släppa lös programmet bild på dem får du ett gäng konverterade bilder som du kan göra en ny gif:
(Jag har konverterat alla konverterade bilderna tillbaka tillsammans i en gif, detta sker inte automatiskt)
Men viktigare programmet returnerar också hela wav-fil där du kan se ett utdrag nedan. Du känner lätt igen de separata ramarna. (det är inzoomad)
Något konstigt att jag inte kan förklara omedelbart är att det inte fungerar med bilder redan i gråskalor.
Även om stora delar av helt vita eller helt svarta pixlar är närvarande, fungerar det eiter.
Uppdatering: Om alla ovanstående är lite alltför teknisk, eller om du har problem med att sammanställa eller installera biblioteken, jag har lagt till körbara i en zip nedan. (så, packa upp och köra det om du litar på mig)
Dock har jag märkt att det inte fungerar i windows, vilket är irriterande. Det är inte så trivialt som jag trodde det skulle vara.