Stavanger, 23. januar 2017 Det teknisknaturvitenskapelige fakultet ELE610 Prosjekter i robotteknikk, vår 2017. Bildefangst-del, oppgave 2. Hensikten med denne øvingen er å kunne bruke et ueye XS kamera sammen med Matlab og Python. 2 Bildefangst med ueye kamera I denne øvinga skal vi bruke ueye XS kamera fra IDS, se IDS µeye for mer informasjon om kamera. Dere bør installere og bruke de siste kameradrivere fra IDS, de er tilgjengelige her: IDS downloads, i januar 2017 er det versjon 4.81 som er siste Windowsversjon. Det er også drivere for Linux. Dere må registrere dere hos IDS for å få laste ned drivere, eller hvis dere har en USB minnepinne kan dere kopiere (Windows ver. 4.81) fra Karl sin PC, 429 MB. Øvingene nedenfor har jeg testet på en bærbar PC, med Windows 7 OS og Matlab 2012b, altså på grensen til foreldet Matlab software. Dere har sannsynligvis nyere PC og software, og det kan da være litt annerledes for dere, forhåpentligvis bedre og enklere men ikke nødvigvis slik. Uansett er mye av hensikten med denne oppgaven å bruke ueye XS kamera sammen med ulik hardware og software. 2.1 Bruke program fra IDS Installer drivere og programmer fra IDS på en PC, fortrinnsvis deres egen bærbare PC men stasjonære PC på lab E464 skal også kunne brukes. Det er nå installert driver på PC nærmest tavla. Koble kamera til USB-port på PCen og start IDS Camera Manager. Videre forklarer jeg det ut fra eget oppsett, jeg har versjon IDS Camera Manager ver. 4.81.0.0 64 bit og den kom greit opp. Nå skal tilkoblet kamera vise i Camera list øverst i skjermbilde. Midt i skjermbilde er flere knapper, se på Karl Skretting, Institutt for data- og elektroteknikk (IDE), Universitetet i Stavanger (UiS), 4036 Stavanger. Sentralbord 51 83 10 00. Direkte 51 83 20 16. E-post: karl.skretting@uis.no.
Figur 1: Bilde tatt med ueye Cockpit. Det viser skjermbilde med nettopp ueye Cockpit programmet kjøre. både generell informasjon og kamera informasjon. Deretter kan en dobbelklikke på linjen med kamera og da kommer et nytt program fram, ueye Cockpit. Her er det 5 store ikoner midt i boksen, og nede til høyre to knapper. Trykk på Help og IDS brukermanual kommer opp (HTML-fil vises i nettleser). I brukermanualen er det mye å lese, både nyttige ting og mer tekniske spesielle ting som ikke er interessante for oss i første omgang. Del A har litt grunnlegge om kamera, se litt gjennom det som står der. Del B er om bruk av kamera og denne delen er mest interessant i første omgang, spesielt Quick start delen. Se på de ulike alternativene i ueye Cockpit programmet. Til slutt lagrer dere et eller flere bilder, gjerne tatt med litt ulike innstillinger og ser på eventuelle ulikheter. Ta gjerne med noen relevante kommentarer til det dere observerer. Ta et bilde med i rapporten. Med ueye Cockpit programmet, og når en trykker på ikonet for Open camera så kommer bildet fram. Jeg gjengir i figur 1 et bilde tatt med lav oppløsning (VGA). Dessverre har ikke programmet (eller hardware) vært helt stabilt. Det har ht at IDS-drivere eller PCen ikke har fått kontakt med kamera, det har da 2
oftest fungert etter en ny oppstart av PC. En gang har jeg også opplevd at PCen har låst seg fullstig, blå-skjerm på PC. 2.2 Bruke ueye kamera fra Matlab Oppgaven er å bli godt kjent med hvordan ueye kamera og Matlab best brukes for å ta bilde. En oppgave her er å ta bilde av et A4-ark som ligger på bordet. Kamera skrus da av holderen på testbrettet og holdes med handa en halvmeter eller deromkring over bordet når bildet tas. Deretter gjøres litt grunnlegge bildebehandling for å finne hjørnene for arket i bildet, det er altså pixelposisjoner en er ute etter, hvor er arket i koordinatsystemet for bilde. Videre, hvis en ønsker litt ekstra utfordringer, kan en finne posisjon og orientering for kamera, senter i linsa, i forhold til et aksesystem der origo er midt på arket, x-akse parallell med lang kantside og y-kase parallell med kort kantside og z-akse oppover. For å løse dette parktiske og konkrete problemet må dere bruke geometrikunnskap dere lærte i maskinsyndelen av bildebehandlingsfaget. Det er nødvig å tegne god figur der avstander og vinkler markeres tydelig. En må videre formulere problemet tydelig med matematiske ligninger, og forklare klart og tydelig hvordan en vil løse dette problemet. Først når det er gjort kan en forsøke å implementere løsning i Matlab. En må ha Image Acquisition Toolbox (IAT) installert for å bruke IDS ueye kamera fra Matlab, vel, i hvert fall er det det som brukes i eksempelet her. Sjekk om du har IAT installert, og hvis ikke installler denne pakken fra Matlab si nettside. Lisens er fra UiS men det kan være problematisk om mange kjører dette samtidig. Et godt alternativ er å be leverandør, MathWorks, om en prøvelisens, få det, og installere IAT. Prøvelisensen er sannsynligvis gyldig i 30 dager og det er da tilstrekkelig i denne sammenheng. Der kan en få hardware informasjon med imaqhwinfo(.), se help og se det dere får. Det er ikke usannsynlig at dere har flere installerte adaptors, det er ofte innbygd kamera i PCen også, og hvert kamera kan ha flere adaptors (drivere?). Jeg får at mange av adaptorene ikke har noen deviceid tilknyttet, de er da ikke tilgjengelige for bruk. Den ene, info = imaqhwinfo( winvideo ), hadde derimot to eller tre deviceid tilknyttet og en kan finne mer informasjon om disse: dev1 = imaqhwinfo( winvideo,1). En må gjerne starte med kamera innebygd i PCen, og koble Matlab til dette med vid = videoinput( winvideo,1, RGB24 320x240 ) og se på resultat med preview(vid). Dette virker greit på min PC. get(vid) viser parametrene og verdier for dette objektet. Videre kan en starte bildefangst start(vid);, hente en serie med bilder (default er 10 bilder) data = getdata(vid); og avslyutte med å stoppe bildefangst stop(vid);. Ønskes bare et enkelt bilde kan en sette set(vid, FramesPerTrigger,1); 3
og så ta bilde med start(vid); A = getdata(vid); stop(vid);. Bilde kan så vises image(a) og behandles videre. Når IDS ueye kamera er koblet til en USB-port på PCen, drivere installert og IDS ueye Cockpit programmet virker greit, så skal det også virke greit fra Matlab. Nå fikk jeg opp et tredje device for winvideo adaptoren. Dette er IDS ueye kamera, og jeg kan nå finne mer informasjon med dev3 = imaqhwinfo( winvideo,3). Jeg ser at DeviceName nå har med serienummeret på ueye kamera. SupportedFormat feltet innehelder et cell array med 14 elementer. Disse kan vises med disp(dev3.supportedformats). Jeg kan velge vid = videoinput( winvideo,3, RGB24 1280x960 ) og så ta et bilde med set(vid, FramesPerTrigger,1); og start(vid); A = getdata(vid); stop(vid);. Jeg ser at bildet kommer opp ned og tekst blir speilvt i forhold til slik det ble med IDS Cockpit programmet. Dette kan kanskje enklest ordnes med A = flipdim(a,1);, i nyere Matlab-versjoner A = flip(a,1);. Jeg prøver litt, og får fram en del bilder men ikke alltid helt som ønsket. Det er ikke direkte enkelt å få oversikt over muligheter med Image Acquisition Toolbox, men med det grafiske grensesnittet imaqtool så får en god hjelp. En kan blant annet se på sesjons-loggen, der vises kommandoer som er brukt. Videre, når bildet er lest inn i Matlab, kan en prøve litt bildebehandling for å identifisere noen punkt i motivet, hjørner i et A4 ark her. I øving 1 var bildebehandling lengst mulig gjort med gråtonebilder, her går vi til sort-hvittbilde straks. % finner kanter E = edge(a, canny,0.25); % gjør fet og fjerne smådeler BW = bwareaopen(imdilate(e,ones(3)), 500, 8); % beholder kun største del BW = beholdstorstedel(bw); % og tar tilbake til kantbilde E = E & BW; % figure(1); clf; colormap(gray); imagesc(e); axis equal; title(sprintf( E %4i x %4i har %i kantpiksler.,size(e), nnz(e) )); % radon, eller alternativ hough(), finner linjer theta = 0:179; [R, xp] = radon(bw, theta); P = houghpeaks(floor(r), 4, NHoodSize,[31,9], Threshold,50 ); % finner der linjer krysser hverandre C = zeros(0,2); % corners cen = floor(size(bw)/2); for k1 = 1:size(P,1) 4
lin1 = [xp(p(k1,1)), theta(p(k1,2))]; for k2 = (k1+1):size(p,1) lin2 = [xp(p(k2,1)), theta(p(k2,2))]; x = round(this_linjekryss(lin1, lin2) + cen); if ((x(1) >= 1) && (x(1) <= size(e,1)) &&... (x(2) >= 1) && (x(2) <= size(e,2))); C = [C; x]; %#ok<agrow> % En kunne muligens fått mer presis lokalisering av hvert hjørne % ved å se på et utsnitt av bilde omkring hvert hjørne og finne % linjer med høyere oppløsning for vinkler. % En bør videre sortere hjørnene i C i rett rekkefølge figure(1); hold on; % men her plottes de kun for k = 1:size(C,1) plot(c(k,2), C(k,1), yo, MarkerSize,12, MarkerFaceColor, y ); 5
I koden ovenfor er det brukt noen egne funksjoner, this linjekryss() er som i øving1 mens beholdstorstedel() er som nedenfor. function BW = beholdstorstedel(bw) cc = bwconncomp(bw, 8); k_largest = 1; k_size = 0; for k = 1:cc.NumObjects if (numel(cc.pixelidxlist{k}) > k_size) k_size = numel(cc.pixelidxlist{k}); k_largest = k; % beholder kun største del for k = [1:(k_largest-1),(k_largest+1):cc.NumObjects] BW(cc.PixelIdxList{k}) = 0; return 2.3 Bruke ueye kamera fra Python Dere får prøve hva dere får til med Python og ueye kamera. Klare dere å gjøre det samme som i Matlab er det meget bra. Jeg vil sette pris på om dere i rapporten tar med litt Python kode som viser hva dere har fått til, gjerne også resultat. 6