Stap 11: Afbeeldingen omzetten in geluid!
Om te spelen iets op de televisor, een afbeelding (de film bestaat uit afzonderlijke beelden) moeten worden gedifferentieerd naar een verschillende lichtsterkte van de LED's binnen de televisor.
Zoals iedere hole het venster doorkruist, bepaalt de wisselende intensiteit van de LED's de intensiteit van die specifieke locatie waar een gat op dit moment ligt. Dus wordt het beeld gevormd door de regel.
Ik heb al gezegd dat de intensiteit van de LED's als een audioapparaat zal worden gecontroleerd. Dit is gewoon audio coming out van een hoofdtelefoonaansluiting van mijn laptop in een versterker op de LED. (meer daarover later)
Dus, het programma moet de witheid van de lijnen omzetten in een spanning in de audio-uitgang van mijn laptop.
Principe een geluidsbestand moet worden gecreëerd en gespeeld, het is zo simpel.
Om dit te doen, is een beeld genomen en onderverdeeld in 24 kolommen (elke één vertegenwoordigt een gat overschrijding van het venster). Elke regel wordt vervolgens omgezet in een afbeelding met grijstinten .
De witheid of intensiteit wordt berekend als volgt:
Elke pixel heeft een waarde van rood, groen en blauw, samen vormen ze de specifieke kleur die u ziet. Als u wilt converteren van deze rode, waargenomen groene en blauwe waarden in de algemene intensiteit van het oog, volgende formule wordt gebruikt:
intensiteit = 0,29 * rood + 0.71 * groen + 0,08 * blauw.
Dit is omdat de gevoeligheid van het oog voor verschillende kleuren verschilt. (Ook, merk op dat in het wikipedia-artikel vindt u 2 formules, maar sindsdien kwam ik op naar de tweede men het meest, thats degene die ik gebruik. En dus het meest geschikt is voor gebruik in televisies werd vastgesteld (maar het maakt niet uit welke van de twee wordt gebruikt, is er niet veel verschil)
Opmerking dat ik onmiddellijk de intensiteit opslaan in een array van 'short' Dit is omdat een korte 2 bytes of 16 bits lang is de resolutie die ik gebruik voor mijn wav-bestand.
Er zijn nu 24 arrays van intensiteiten die moeten worden in een WAV-bestand. Afhankelijk van de snelheid van de steekproef, zijn deze arrays weggegooid.
Bijvoorbeeld om te bouwen mijn WAV-bestand, ik wil om het te spelen met een sample snelheid van 44100 Hz, die de meest voorkomende samplefrequentie is. En de schijf duurt 1/12 seconden te draaien. En iedere hole doorkruist het venster tijdens de periode dat de schijf moet draaien 14.8 graden, dus een 14,8/360 deel van een rotatie. Dus, gewoon volgende formule wordt gebruikt:
amount_bins = SPS * (Rotationperiod) * (deel van de rotatie een gat is zichtbaar)
Dit komt neer op 151 (afgeronde) opslaglocaties in mijn geval.
Dus, in eenvoudige termen, het beeld is nu verdeeld in 151 rijen en kolommen van de 24. En alle onderdelen zijn intern gemiddeld zodat je met een afbeelding met grijstinten van 24 door 151 pixels eindigen.
Vanuit deze omgezette afbeelding die de 24 rijen (elk een een matrix van 151 getallen) vervolgens samen na elkaar afgegeven aan formulier gestikt zijn een array van 24 * 151 = 3624 nummers of monsters. Wanneer deze gegevens wordt gebracht in het WAV-bestand, zal het het geluid dat nodig is voor het produceren van een afbeelding.
MAAR, een revolutie van de schijf duurt 1/12e van een seconde en met een sample rate van 44100 Hz dit gebruikersaccounts aan 3675 monsters. Dus, ziet u dat er 51 nummers niet gebruikt. En dit is helemaal fijn, want dat is gewoon dat kleine stukje van ongebruikte ruimte op de schijf, als je kijkt naar de sjabloon van de posities van de gat in een van de eerste stappen.
Dit is principe al belangrijk materiaal.
Nu is de gegevens simpel gezegd in een WAV-bestand. Ik verwijs naar deze pagina op het formaat van WAV-geluiden tot in detail weten de regelingen van de bytes. U herkent alles van die pagina in de makeWav() functie (en de printInfo() fuction) duidelijk in het bestand 'wavreader.cpp'. Ik gewoon binaire afdrukken alle van de dingen die ze zeggen.
Wat je eindigen met is een audio-bestand. Als de disc uit de televisor wordt gesponnen tot de juiste snelheid en het geluidsbestand dat wordt afgespeeld (doorlopend 1000 keer voor het gemak) dan het beeld kan men duidelijk zien afromen over het scherm.
Zo, eerst en vooral voor het programma zelf gebruik ik Magick ++ omdat ImageMagick ongelooflijk krachtig en makkelijk te gebruiken is. Ik was erg blij dat het ook een beeldbewerking bibliotheek voor C++ genaamd Magick ++ geboden.
Alle de lezing en het schrijven van pixels werd gedaan met deze bibliotheek. Er is een heleboel uitleg over hoe te installeren en gebruiken op hun belangrijkste pagina, voor linux, mac en windows.
Ten tweede ik een oud stukje van de kabeljauw die ik een lange tijd geleden heb geschreven. Ik wilde de gegevens lezen uit een WAV-bestand, dus ik schreef een wavreader. Pas op dat er wat vuil code (Vergeet niet de waarschuwingen). Het is een mix van C en C++, werkt prima maar het is niet juist.
Het probleem was (en is) dat ik niet weet hoe ik een FileAid als lid van een klasse kan hebben. Of iets gemakkelijk die permanent onthoudt wat plaatst u het op in een bestand. Dus ik ging van de C-stijl en een eenvoudige bestands pointer gebruikt.
Dus, ik gebruik Linux, en dit is de compile-commando dat werkt:
g++ -O3 -o image main.cpp wavreader.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs`
(als je het probeert, u zal zien 3 waarschuwingen dat sommige retourwaarden zijn genegeerd, het is niet dat slecht, ze gewoon op te lossen wat (voor mij) nutteloze dingen aan toevoegt sommige echt kleine functies). (en de - O3 is een beetje voor snelheid, maar het maakt niet uit want ik heb niet geprobeerd dit programma met grote batches van foto's)
Natuurlijk kunt u uw favoriete GUI alleen oppassen dat het niet een normale vlag. Ik heb nog nooit gezien dit eerder, maar Magick ++-config is iets dat automatisch de vlaggen vandaar drukt het ' ' symbolen.
En in qtCreator bijvoorbeeld heb je deze regel toevoegen aan het pro-bestand:
QMAKE_CXXFLAGS += $$ systeem (Magic ++-config--cxxflags--cppflags)
(dat is raar, dat is de reden waarom ik het gemaakt in Codeblocks waar u enkel de litteraly spullen toevoegen kon zoals deze wordt weergegeven in de compile-opdracht)
Eigenlijk het programma te gebruiken die u enkel typen:
./image Saturn.jpg
(dat is in mijn geval de
van wikipedia) Na een kwart van een seconde of zo, wordt de afbeelding boven deze pagina teruggezonden samen met het audio-bestand (zie hieronder).
Kijk naar de foto van het audio-bestand in de audio, herkent u duidelijk de linker kant van de ring in de dubbele pieken! (Saturn.wav)
Als je twee beelden als argument geven, het programma steken ze elkaar automatisch: (namen en de .wav als het eerste argument)
BV
./image Saturn.jpg face.jpg
(het gezicht was die van René van ' Allo ' Allo!)
Dit geeft dan na wav-bestand: (opnieuw genoemd Saturn.wav)
Maar om aan te tonen van de functionaliteit van dit kleine programma laat onderzoeken dit gif: (gekregen van hier)
U kunt dan krijgen met Imagemagick alle afzonderlijke frames. Als u ze in een map plaatsen en het programma van het beeld op hen ontketenen krijg je een heleboel geconverteerde afbeeldingen waaruit kunt u een nieuwe gif:
(Ik heb al de geconverteerde afbeeldingen weer bij elkaar in een gif, dit gebeurt niet automatisch omgezet)
Maar belangrijker is het programma ook weer de gehele wav-bestand waaruit u een fragment hieronder kunt zien. U kunt gemakkelijk herkennen de afzonderlijke frames. (het is ingezoomd)
Iets raar dat ik niet meteen uitleggen is dat het niet werkt met afbeeldingen die al in grayscales.
Ook als grote gebieden van volledig zwart of volledig witte pixels aanwezig zijn, werkt het niet Eiteren.
Update: Als al het bovenstaande is een beetje te technisch, of hebt u problemen bij het compileren of het installeren van de Bibliotheken, ik heb het uitvoerbare bestand in een zip hieronder toegevoegd. (dus, unzip en stormloop op als u vertrouwt me)
Ik heb echter gemerkt dat het niet op windows werkt, wie zit vervelend. Het is niet zo onbelangrijk als ik dacht dat het zou.