Digitale beeldverwerking Joeri Barbarien 22 11 2020 Herhaling
Digitale beeldverwerking Joeri Barbarien 22 -11 -2020 Herhaling titel van presentatie 1
Doel Gebruiker geeft stelhoogte in door de hand een aantal seconden op deze positie te houden. Webcam (resolutie 640 x 480 pixels) h 1 (640 or 480) h 3 PC h 2 Instellen gewenste eindpositie ping-pong bal met behulp van een webcam en beeldverwerking Digitale beeldverwerking 22 -11 -2020 Pag. 2
Digitale beelden Beeld = matrix van pixels Pixel Deze intensiteiten worden typisch opgeslagen als een 8 -bit getal (0 -255) 0 255 Voorbeelden: In een kleurenbeeld wordt elke pixel gekenmerkt door een rode, groen en blauwe lichtintensiteit (RGB) Digitale beeldverwerking 22 -11 -2020 Pag. 3 = 255, 0, 0 = 0, 255, 0 = 255, 0, 255 = 0, 0, 255 = 128, 128 = 255, 0 = 255, 255
Digitale beelden (Java) public class My. RGBImage { 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 My. RGBImage(Image im) {. . . } public Image get. Image() {. . . } public int get. Width() {. . . } public int get. Height() {. . . } public int get. Size() {. . . } public RGBPixel get. Pixel(int x, int y) {. . . } public void set. Pixel(int x, int y, RGBPixel pixel) {. . . } } Digitale beeldverwerking 22 -11 -2020 Pag. 4 Raster scan x y 0 1 2 3 4 5 6 7 W-1 0 1 … 2 Height (H) 3 4 … … … H-1 Width (W) Convert to 1 D array (0, 0) (2, 0) (1, 0) (4, 0) (3, 0) i = x+y*W … … (W-1, 0) … (1, 1) … (0, 1) …
Digitale beelden (Java) public class My. RGBImage { 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 My. RGBImage(Image im) {. . . } public Image get. Image() {. . . } public int get. Width() {. . . } public int get. Height() {. . . } public int get. Size() {. . . } public RGBPixel get. Pixel(int x, int y) {. . . } public void set. Pixel(int x, int y, RGBPixel pixel) {. . . } } Digitale beeldverwerking 22 -11 -2020 Pag. 5 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 get. Red() {. . . } public int get. Green() {. . . } public int get. Blue() {. . . } public int get. Alpha() {. . . } public void set. Pixel( int red, int green, int blue, int alpha) {. . . } public void set. Red(int red) {. . . } public void set. Green( int green) {. . . } public void set. Blue( int blue) {. . . } public void set. Alpha( int alpha) {. . . } }
Beelden ophalen van de webcam public class Frame. Grabber implements Controller. Listener { public Frame. Grabber() throws Frame. Grabber. Exception {…}//Constructor public void start. Capturing() throws Frame. Grabber. Exception public void stop. Capturing() {…}//Stop ophalen beelden public boolean capturing. Is. Started(){…} public Image grab. Image() throws Frame. Grabber. Exception {…}//Vraag het huidige beeld op //Enkele algemene instellingen ophalen public int get. XResolution() {…} public int get. YResolution() {…} public int get. Bit. Depth() {…} //aantal bits per kleur public String get. Devicenaam(){…} public class Grabber. Thread extends Thread { … } } Digitale beeldverwerking 22 -11 -2020 Pag. 6 {…}//Start ophalen beelden
Beelden tonen van de Webcam public class Main. Window extends JFrame public Main. Window() { { private Timer timer; timer = new Timer(delay, new Timer. Listener()); . . . } public class My. Listener extends Window. Adapter . . . { private void get. Current. Image(). . . { public void window. Opened(Window. Event evt) try { { try{theframegrabber. start. Capturing(); } currentimage=theframegrabber. grab. Image(); In de constructor van catch(Frame. Grabber. Exception exception) . . . het window wordt een {. . . } repaint(); timer object } } aangemaakt } catch(Frame. Grabber. Exception exception) public class Timer. Listener implements Action. Listener { public void action. Performed(Action. Event e) { get. Current. Image(); detect. Level(); } }. . . Digitale beeldverwerking 22 -11 -2020 Pag. 7 {. . . } } public void detect. Level() { My. RGBImage image = new My. RGBImage(currentimage, p. Settings); int newlevel = image. detect. Level(. . . ); . . . } }
Beelden tonen van de Webcam public class Main. Window extends JFrame { private Timer timer; . . . public class My. Listener extends Window. Adapter {. . . public void window. Opened(Window. Event evt) { try{theframegrabber. start. Capturing(); } catch(Frame. Grabber. Exception exception) {. . . } } } public Main. Window() { timer = new Timer(delay, new Timer. Listener()); } . . . private void get. Current. Image() { try bij openen van het window { (window. Opened event) currentimage=theframegrabber. grab. Image(); wordt de webcam . . . capturing gestart repaint(); } catch(Frame. Grabber. Exception exception) {. . . } public class Timer. Listener implements Action. Listener } { public void detect. Level() public void action. Performed(Action. Event e) { { My. RGBImage image = new My. RGBImage(currentimage, p. Settings); get. Current. Image(); int newlevel = image. detect. Level(. . . ); detect. Level(); . . . } }. . . } Digitale beeldverwerking 22 -11 -2020 Pag. 8
Beelden tonen van de Webcam public class Main. Window extends JFrame { private Timer timer; . . . public class My. Listener extends Window. Adapter {. . . public void window. Opened(Window. Event evt) { try{theframegrabber. start. Capturing(); } catch(Frame. Grabber. Exception exception) {. . . } } } public Main. Window() { timer = new Timer(delay, new Timer. Listener()); } . . . private void get. Current. Image() { try { currentimage=theframegrabber. grab. Image(); Elke keer de timer afloopt (na delay . . . ms) wordt een frame gecaptured repaint(); (get. Current. Image) en wordt de } detectie uitgevoerd (detect. Level) catch(Frame. Grabber. Exception exception) {. . . } public class Timer. Listener implements Action. Listener } { public void detect. Level() public void action. Performed(Action. Event e) { { My. RGBImage image = new My. RGBImage(currentimage, p. Settings); get. Current. Image(); int newlevel = image. detect. Level(. . . ); detect. Level(); . . . } }. . . } Digitale beeldverwerking 22 -11 -2020 Pag. 9
Beelden tonen van de Webcam public class Main. Window extends JFrame { private Timer timer; . . . public class My. Listener extends Window. Adapter {. . . public void window. Opened(Window. Event evt) { try{theframegrabber. start. Capturing(); } catch(Frame. Grabber. Exception exception) {. . . } } } public Main. Window() { timer = new Timer(delay, new Timer. Listener()); } . . . private void get. Current. Image() { try “detect. Level” { zet het gecapturede beeld om naar een My. RGBImage currentimage=theframegrabber. grab. Image(); zodat de toegankelijk pixelwaarden . . . worden. De eigenlijke detectie wordt repaint(); uitgevoerd in image. detect. Level() } catch(Frame. Grabber. Exception exception) (zelf te implementeren) {. . . } public class Timer. Listener implements Action. Listener } { public void detect. Level() public void action. Performed(Action. Event e) { { My. RGBImage image = new My. RGBImage(currentimage, p. Settings); get. Current. Image(); int newlevel = image. detect. Level(. . . ); detect. Level(); . . . } }. . . } Digitale beeldverwerking 22 -11 -2020 Pag. 10
Algoritme voor detectie Frame differencing Thresholding if(value>th) set to 1 (white) else set 0 (black) Referentie frame (opgenomen bij initialisatie) SA D T H Absolute waarde van het verschil tussen de pixelwaarden (SAD – sum of absolute differences) in de twee frames berekenen Huidig frame Digitale beeldverwerking 22 -11 -2020 Pag. 11 Niveau detectie Right. Light en Autogain van de camera afzetten voor beste resultaten.
Algoritme voor detectie Frame differencing Niveau detectie a) Verwijder ruis (bvb): • Verdeel beeld in blokken van 4 x 4 or 8 x 8 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 22 -11 -2020 Pag. 12
- Slides: 12