Download de presentatie
De presentatie wordt gedownload. Even geduld aub
1
Digitale beeldverwerking
Joeri Barbarien Herhaling titel van presentatie
2
Doel Gebruiker geeft stelhoogte in door de hand een aantal seconden op deze positie te houden. Webcam (resolutie 640x480 pixels) h1 (640 or 480) PC h3 h2 Instellen gewenste eindpositie ping-pong bal met behulp van een webcam en beeldverwerking Digitale beeldverwerking
3
Digitale beelden Deze intensiteiten worden typisch opgeslagen als een 8-bit getal (0-255) Pixel Beeld = matrix van pixels 255 Voorbeelden: In een kleurenbeeld wordt elke pixel gekenmerkt door een rode, groen en blauwe lichtintensiteit (RGB) = 255,0,0 = 0,255,255 = 0,255,0 = 255,0,255 = 0,0,255 = 128,128,128 = 255,255,0 = 255,255,255 Digitale beeldverwerking
4
Digitale beelden (Java)
public class MyRGBImage { private int width; private int height; private int[] red; //red component private int[] green; //green component private int[] blue; //blue component private int[] alpha; //alpha component public MyRGBImage(Image im) {...} public Image getImage() {...} public int getWidth() {...} public int getHeight() {...} public int getSize() {...} public RGBPixel getPixel(int x, int y) {...} public void setPixel(int x, int y, RGBPixel pixel) {...} } x y Raster scan 1 2 3 4 5 6 7 W-1 1 2 3 4 … Height (H) … … … H-1 Width (W) Convert to 1D array … (0,0) (2,0) (4,0) … (W-1,0) (1,1) … … (1,0) (3,0) … (0,1) i = x+y*W Digitale beeldverwerking
5
Digitale beelden (Java)
public class RGBPixel { private int red; private int green; private int blue; //private int alpha; Transparantie public RGBPixel() {...} public RGBPixel(int red,int green,int blue,int alpha) {...} public int getRed() {...} public int getGreen() {...} public int getBlue() {...} public int getAlpha() {...} public void setPixel(int red,int green,int blue,int alpha) {...} public void setRed(int red) {...} public void setGreen(int green) {...} public void setBlue(int blue) {...} public void setAlpha(int alpha) {...} } public class MyRGBImage { private int width; private int height; private int[] red; //red component private int[] green; //green component private int[] blue; //blue component private int[] alpha; //alpha component public MyRGBImage(Image im) {...} public Image getImage() {...} public int getWidth() {...} public int getHeight() {...} public int getSize() {...} public RGBPixel getPixel(int x, int y) {...} public void setPixel(int x, int y, RGBPixel pixel) {...} } Digitale beeldverwerking
6
Beelden ophalen van de webcam
public class FrameGrabber implements ControllerListener { public FrameGrabber() throws FrameGrabberException {…}//Constructor public void startCapturing() throws FrameGrabberException {…}//Start ophalen beelden public void stopCapturing() {…}//Stop ophalen beelden public boolean capturingIsStarted(){…} public Image grabImage() throws FrameGrabberException {…}//Vraag het huidige beeld op //Enkele algemene instellingen ophalen public int getXResolution() {…} public int getYResolution() {…} public int getBitDepth() {…} //aantal bits per kleur public String getDevicenaam(){…} public class GrabberThread extends Thread { … } Digitale beeldverwerking
7
Beelden tonen van de Webcam
public class MainWindow extends JFrame { private Timer timer; ... public class MyListener extends WindowAdapter public void windowOpened(WindowEvent evt) try{theframegrabber.startCapturing();} catch(FrameGrabberException exception) {...} } public class TimerListener implements ActionListener public void actionPerformed(ActionEvent e) getCurrentImage(); detectLevel(); public MainWindow() { timer = new Timer(delay, new TimerListener()); } ... private void getCurrentImage() try currentimage=theframegrabber.grabImage(); repaint(); catch(FrameGrabberException exception) {...} public void detectLevel() MyRGBImage image = new MyRGBImage(currentimage, pSettings); int newlevel = image.detectLevel(...); In de constructor van het window wordt een timer object aangemaakt Digitale beeldverwerking
8
Beelden tonen van de Webcam
public class MainWindow extends JFrame { private Timer timer; ... public class MyListener extends WindowAdapter public void windowOpened(WindowEvent evt) try{theframegrabber.startCapturing();} catch(FrameGrabberException exception) {...} } public class TimerListener implements ActionListener public void actionPerformed(ActionEvent e) getCurrentImage(); detectLevel(); public MainWindow() { timer = new Timer(delay, new TimerListener()); } ... private void getCurrentImage() try currentimage=theframegrabber.grabImage(); repaint(); catch(FrameGrabberException exception) {...} public void detectLevel() MyRGBImage image = new MyRGBImage(currentimage, pSettings); int newlevel = image.detectLevel(...); bij openen van het window (windowOpened event) wordt de webcam capturing gestart Digitale beeldverwerking
9
Beelden tonen van de Webcam
public class MainWindow extends JFrame { private Timer timer; ... public class MyListener extends WindowAdapter public void windowOpened(WindowEvent evt) try{theframegrabber.startCapturing();} catch(FrameGrabberException exception) {...} } public class TimerListener implements ActionListener public void actionPerformed(ActionEvent e) getCurrentImage(); detectLevel(); public MainWindow() { timer = new Timer(delay, new TimerListener()); } ... private void getCurrentImage() try currentimage=theframegrabber.grabImage(); repaint(); catch(FrameGrabberException exception) {...} public void detectLevel() MyRGBImage image = new MyRGBImage(currentimage, pSettings); int newlevel = image.detectLevel(...); Elke keer de timer afloopt (na delay ms) wordt een frame gecaptured (getCurrentImage) en wordt de detectie uitgevoerd (detectLevel) Digitale beeldverwerking
10
Beelden tonen van de Webcam
public class MainWindow extends JFrame { private Timer timer; ... public class MyListener extends WindowAdapter public void windowOpened(WindowEvent evt) try{theframegrabber.startCapturing();} catch(FrameGrabberException exception) {...} } public class TimerListener implements ActionListener public void actionPerformed(ActionEvent e) getCurrentImage(); detectLevel(); public MainWindow() { timer = new Timer(delay, new TimerListener()); } ... private void getCurrentImage() try currentimage=theframegrabber.grabImage(); repaint(); catch(FrameGrabberException exception) {...} public void detectLevel() MyRGBImage image = new MyRGBImage(currentimage, pSettings); int newlevel = image.detectLevel(...); “detectLevel” zet het gecapturede beeld om naar een MyRGBImage zodat de pixelwaarden toegankelijk worden. De eigenlijke detectie wordt uitgevoerd in image.detectLevel() (zelf te implementeren) Digitale beeldverwerking
11
Algoritme voor detectie
Frame differencing Thresholding if(value>th) set to 1 (white) else set 0 (black) Referentie frame (opgenomen bij initialisatie) SAD TH Absolute waarde van het verschil tussen de pixelwaarden (SAD – sum of absolute differences) in de twee frames berekenen Niveau detectie Huidig frame RightLight en Autogain van de camera afzetten voor beste resultaten. Digitale beeldverwerking
12
Algoritme voor detectie
Frame differencing Niveau detectie a) Verwijder ruis (bvb): Verdeel beeld in blokken van 4x4 or 8x8 pixels Als een blok >x% witte pixels bevat, verander dan alle pixels in het blok naar witte pixels, anders verander alle pixels in het blok naar zwarte pixels Als er een rij van ten minste y aaneensluitende witte blokken overblijft kan het niveau gedetecteerd worden. b) Niveau detectie Door zwaartepunt van de witte blokken te bepalen Als het niveau stabiel blijft over meerdere frames, geef dan door aan de controller via USB Digitale beeldverwerking
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.