Innholdsfortegnelse:
- Trinn 1: Materialer
- Trinn 2: OUTPUT - VGA -kontroller del 1
- Trinn 3: OUTPUT - VGA -kontroller del 2
- Trinn 4: UTGANG - HDMI -kontroller Del 1
- Trinn 5: UTGANG - HDMI -kontroller del 2
- Trinn 6: Vise bilder fra RAM
- Trinn 7: OUTPUT - SDK END
Video: Zynq Image Enhancement System: 7 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:24
Som du sannsynligvis kan finne ut av tittelen, er målet med dette prosjektet å lage et bildeforbedringssystem ved hjelp av ZYNQ ApSOC. Mer spesifikt ønsker vi å bygge et system som kan fjerne tåken fra bilder eller video. Dette systemet vil ta under dårlige forhold visuelle data som inngang, behandle det ved hjelp av bildeforbedringsteknikker og deretter sende ut resultatet.
Prosjektet ble bygget og testet på Digilent Zybo Board, men andre ZYNQ -enheter burde også fungere.
Vi vil dele dette prosjektet i tre deler:
1) INPUT = Input Image via Ethernet fra datamaskin/kamera
2) PROCESS = Behandle bildet
3) OUTPUT = Send ut bildet via et HDMI -grensesnitt
På en veldig kontraintuitiv måte begynner vi med utdatadelen av prosjektet (dette vil gi oss bedre feilsøkingsmuligheter underveis) fortsette med innspill og avslutte med behandlingsdelen.
Trinn 1: Materialer
For å fullføre dette prosjektet trenger du:
MASKINVARE
- ethvert ZYNQ -kort med HDMI og Ethernet skal fungere / jeg bruker Digilent Zybo
- USB A til mikro B USB -kabel
- HDMI -kabel
- Ethernet -kabel
- Skjerm med HDMI -inngang
PROGRAMVARE
- Xilinx Vivado
- Xilinx SDK
Trinn 2: OUTPUT - VGA -kontroller del 1
Vi sender ut våre visuelle data ved hjelp av HDMI -porten på kortet. HDMI -porten er koblet til PL (Programmable Logic = FPGA) siden av ZYNQ, og vi må designe en kontroller i VHDL for den. Hvis du noen gang har designet en VGA -kontroller, vil du finne denne veldig lik. Tidspunktene for HDMI og VGA er faktisk de samme, faktisk kan du bygge på en eksisterende VGA -kontroller for å få en HDMI -kontroller.
For en bedre forståelse av hva som faktisk skjer, skal vi først designe en VGA -kontroller
Vi ønsker å vise med en oppløsning på 1920x1080.
VGA -kontrolleren er ansvarlig for å overføre pikseldataene (i RGB -format) sekvensielt, piksel for piksel til skjermen. Utenfor det faktiske visningsarealet på 1920x1080 er det også noen "grense" områder, nemlig: veranda, veranda bak og spor. Størrelsen i piksler på disse områdene er standard og spesifikk for hver oppløsning. Disse områdene vises faktisk IKKE på skjermen, men de er obligatoriske og fargen på pikslene i dette området må være svart. Et gyldig spørsmål vil være hvorfor disse ekstra områdene er nødvendige. Dette spørsmålet trosser formålet med dette instruerbare, men hvis du er nysgjerrig, vil jeg oppfordre deg til å forske videre på nettet.
Dette er en god video som forklarer VGA -grensesnittet
I vårt tilfelle vil vi vise med en oppløsning på 1920*1080, og dette er tidspunktene:
Horisontalt visningsområde = 1920 piksler
Horisontal Fron Porch = 88 piksler
Horisontal veranda på baksiden = 148 piksler
Horisontal sporing = 44 piksler
Vertikalt visningsområde = 1080 piksler
Vertikal veranda = 4 piksler
Vertikal bakside = 36 piksler
Vertikal tilbakeføring = 5 piksler
(Her kan du finne tidspunkt for andre oppløsninger
Så den faktiske oppløsningen vår vil være 2200 x 1125. Vi vil ha 60 fps (bilder per sekund), så vår pikselklokke vil være 60*2200*1125 = 148,5 MHz. På Zybo Board finnes det en klokke på 125 Mhz. Vi vil bruke en MMCM IP for å generere 148,5 MHz Pixel Clock vi trenger.
Trinn 3: OUTPUT - VGA -kontroller del 2
Med den teoretiske bakgrunnen fra forrige trinn, bør du kunne designe din egen VGA -kontroller. Jeg vil gi deg et Vivado -prosjekt som gjør det, men jeg råder deg til å prøve å gjøre det på egen hånd først.
De fleste VGA -porter gir deg ikke 8 bits per fargekanal per piksel (se bildet ovenfor), så du må tilpasse designet til antall pinner per farge som kortet gir (dette er imidlertid ikke et problem for HDMI).
Designet vil male hele skjermen blå, bortsett fra den øverste venstre piksel som vil være rød. Det skal bemerkes at dette prosjektet bruker begrensningene for ZYBO -styret. Så hvis du vil kjøre dette prosjektet på et annet bord, bør du oppdatere begrensningsfilen og tilpasse antall pinner per farge.
Ta en titt på figur nr. 2. Husk at mens VGA -kontrolleren sender ut 5/6 bits per farge, blir disse bitene konvertert til ett analogt signal for hver fargekanal (rød, grønn og blå) før du går gjennom kabelen.
Trinn 4: UTGANG - HDMI -kontroller Del 1
Nå som vi vet hvordan VGA -kontrolleren fungerer og vi har en fungerende design, kan vi fortsette med HDMI -kontrolleren. HDMI -kontrolleren bruker faktisk all koden vi utviklet i VGA -kontrolleren. HDMI og VGA bruker de samme timene og de samme signalene. Forskjellen vises på utgangspinnene.
Mens VGA bruker en ledning for hver farge og sender et analogt signal over den, sender HDMI dataene digitalt 1 bit om gangen for hver farge og bruker differensial signalering. Differensial signalering betyr at for hver bit har HDMI 2 pinner med den ene motsatt av den andre. Så hvis vi ønsker å sende signalet '1', sender vi '1' på en ledning og '1' negeres på den andre ledningen. Dette sikrer signalintegritet, og du kan lese mer om det her https://goo.gl/6CPCzB. Vi har en av disse kanalene for hver farge, RØD, GRØNN og BLÅ og en for klokken. På grunn av spesifikasjonene for differensial signalering må signalene vi sender via hdmi være DC -balansert, noe som betyr at antall 1 og 0 må være omtrent like i et bestemt tidsvindu. For å oppnå dette vil vi bruke 8b/10b -koding. Du kan lære mye om hvordan differensial signalering og 8b/10b -koding fungerer fra DVI -spesifikasjonen her https://goo.gl/hhh8Ge (DVI og HDMI bruker de samme videosignalene).
Trinn 5: UTGANG - HDMI -kontroller del 2
Nok teori, la oss komme til prosjektet vårt. Mens vi i VGA -kontrolleren slapp unna med en 148,5 MHz klokke, må vi her gi 10 ganger den frekvensen fordi vi ønsker å overføre 8 bits for hver farge og bruke 8b/10b -kodingen som oversetter til 10 bits per piksel og 10 *148,5 MHz = 1485 MHz. Det er en enorm frekvens som ikke kan oppnås på Zybo -styret. Heldigvis fikk vi noen triks i ermet. Vi kan administrere 5*148,5MHz = 742,5MHz, og vi vil bruke en OSERDES (serializer) IP for å overføre data både på stigende og fallende kant av 742,5Mhz -klokken, så vi vil faktisk få data overført ved 1485MHz. Vivado vil gi oss noen advarsler om timing, og du kan alltid gå for en lavere oppløsning med en mindre klokke, men siden det fungerer, har vi ikke noe imot det foreløpig (advarslene er knyttet til det faktum at klokkebufferne ikke offisielt gjør det støttefrekvenser høyere enn 464MHz).
Så det vi trenger å gjøre er å kode dataene fra VGA -kontrollerutgangen i 8b/10b -format og deretter serialisere dem som nevnt ovenfor. Vi må også legge til en annen MMCM i prosjektet for å generere 742,5 MHz -klokken for serien.
Jeg har lagt ved vhdl -filene for koderen og serialisereren. Du må først kode RGB -kanalene og deretter serialisere dem.
Eksempel på den røde kanalen:
TMDS_encoder_RED: TMDS_encoder
portkart (clk148, red_channel_8bits, c_red, video_on, encoded_red_10bits);
Serialiser_RED: Serialiser10_1
portkart (clk148, clk742, encoded_red_10bits, reset, red_serial_1bit);
"C" -inngangen til TMDS_encoder er "00" for rødt og grønt og "vsync & hsync" for blått (dette er en del av DVI -spesifikasjonen
Trinn 6: Vise bilder fra RAM
Hensikten med HDMI -kontrolleren er å vise de behandlede bildene. Nå, med kontrolleren implementert og klar til å gå, bør vi tenke på å mate denne kontrolleren med data. Gitt at mye av bildeforbedringsprosessen vil finne sted i PS (Processing System = ARM Processor) og bildene som blir oppdaget vil ligge i DDR RAM. Så vi trenger en måte å få dataene fra RAM til HDMI -kontrolleren.
For å oppnå dette trenger du 3 IP -er:
1) VDMA (Video Direct Memory Access)
2) VTC (Video timing Controller)
3) Stream til Video Out (vi vil kalle det S2VO fra nå av)
S2VO vil faktisk gi et RGB 24BIT -signal til utgangen og de nødvendige HSYNC- og VSYNC -signalene. Så vi kan la den delen av HDMI -kontrolleren være ute.
Du bør legge til disse IP -ene i designet, konfigurere dem og lage riktige tilkoblinger.
Til slutt bør du få noe som ligner skjematisk over.
Trinn 7: OUTPUT - SDK END
Med all maskinvaren satt opp og klar til å gå må vi nå bygge programvaren i PS. Vi vil eksportere maskinvaren og bitstrømmen og lansere SDK.
1) Fil -> Eksporter -> Eksporter maskinvare -> Kontroller Inkluder Bitstream og trykk OK
2) Fil -> Start SDK
Opprett et nytt applikasjonsprosjekt i SDK.
3) Fil -> Ny -> Applikasjonsprosjekt
4) Velg et navn på prosjektet, og trykk på Neste
5) Velg "Hello World" -malen og trykk på Fullfør
Søknaden i SDK må programmere VDMA. Det er noen standardfunksjoner som brukes for å oppnå dette (jeg går inn på detaljer når jeg har tid).
For å teste designet vårt, bruker vi funksjonen SDK Restore (Xilinx Tools -> Dump/Restore) for å sette et bilde inn i DDR RAM -minnet og vise det ved hjelp av HDMI -kontrolleren. Du kan laste bildet hvor du vil (unntatt noen små begrensede områder i begynnelsen av minnet). For vårt eksempel valgte vi adresse 16777216 og filstørrelsen 8294400 = 1920*1080*4 (4 kanaler = RGB + alfa).
Det fungerer !
Fortsettelse følger
Anbefalt:
Motion Triggered Image Capture and Email: 6 trinn
Motion Triggered Image Capture and Email: Vi bygger videre på de tidligere ESP32-CAM-prosjektene og bygger et bevegelsesutløst bildeopptakssystem som også sender en e-post med bildet som vedlegg. Denne bygningen bruker ESP32-CAM-kortet sammen med en PIR-sensormodul som er basert på AM312
Gesture Hawk: Hand Gesture Controlled Robot Using Image Processing Based Interface: 13 trinn (med bilder)
Gesture Hawk: Hand Gesture Controlled Robot Using Image Processing Based Interface: Gesture Hawk ble vist frem i TechEvince 4.0 som et enkelt bildebehandlingsbasert menneske-maskin-grensesnitt. Dens nytte ligger i det faktum at det ikke kreves flere sensorer eller bærbare unntatt en hanske for å kontrollere robotbilen som kjører på forskjellige
WIDI - Trådløs HDMI ved hjelp av Zybo (Zynq Development Board): 9 trinn (med bilder)
WIDI - Trådløs HDMI ved hjelp av Zybo (Zynq Development Board): Har du noen gang ønsket at du kunne koble TV -en til en PC eller bærbar datamaskin som en ekstern skjerm, men ville ikke ha alle de irriterende ledningene i veien? I så fall er denne opplæringen bare noe for deg! Selv om det er noen produkter ute som oppnår dette målet
Lag OpenCV Image Classifiers ved hjelp av Python: 7 trinn
Lag OpenCV Image Classifiers Bruke Python: Haar -klassifiseringer i python og opencv er ganske vanskelig, men lett oppgave. Vi står ofte overfor problemene med bildedeteksjon og klassifisering. den beste løsningen er å lage din egen klassifisering. Her lærer vi å lage våre egne image -klassifisere med noen få kommandoer
Secret Spy Image Photo Copying Batch File: 5 trinn
Secret Spy Image Photo Copying Batch File: Så, først og fremst, hva er dette som kan instrueres og hvorfor. Med denne instruksjonen kan du lage en batchfil som kopierer alle bildene fra en PC til minnepinnen. den vil gjøre dette diskret, og posere som et annet program som er