Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Informationen

Neben der Auswertung von Bildern und dem Erkennen von Bestimmten Mustern, wie Farben oder Gesichtern kann ein Computer Vision Algorithmus auch so programmiert werden, dass er ein Bild auf das Vorhandensein eines bestimmten, einfachen, grafischen Markers untersucht. In diesem Fall spricht man auch von Marker Tracking. Marker Tracking existiert in unterschiedlichen Varianten. Die für uns am besten zu verwendenden sind das Tracking von sog. Fiducials und den sehr weit verbreiteten QR-Markern. Im Folgenden sollen diese zwei Marker Varianten und deren Verwendung in Processing gezeigt werden.

Fiducials

http://reactivision.sourceforge.net

QR-Codes

QR-Code generieren

QR-Codes

Image Added

Folgende Beispiele benutzen die diewald_barcode library um QR-Codes zu generieren und zu lesen.

Code Block
languagejava
titleQR-Code Generieren
collapsetrue
import diewald_bardcode.*;
import diewald_bardcode.CONSTANTS.*;
 
int size = 500;
String content = "http://iad.zhdk.ch";
 
void setup() {
  size(500, 500);
 
  EncodingResult result = Barcode.encode(content, ENCODE.QR_CODE, size,
    size, CHARACTER_SET.DEFAULT, ERROR_CORRECTION.DEFAULT);
    
  if(result.encodingFailed()) {
    println( result.getEncodingException() );
  } else {
    result.setBgColor(255, 255, 255, 255);
    result.setCodeColor(0, 0, 0, 255);
   
    PImage barcode = result.asImage(this);
    if (barcode != null) {
      image(barcode, 0, 0);
      barcode.save("qrcode.jpg");
    }
  }
}
 
void draw() {}
Code Block
languagejava
titleBeispiel QR-Code GenerierenLesen
collapsetrue
import com.aos.zxing4processing.*;

ZXING4P zxingdiewald_bardcode.*;
import diewald_bardcode.CONSTANTS.*;
import processing.video.*;

Capture video;

void setup() {
  size(640, 480);
  video = new ZXING4PCapture(this, 640, 480, 30);
 PImage QRCode;video.start();
}

void setup( draw() {
  if (video.available()) {
  String webLink = "http://iad.zhdk.ch";
  QRCode = zxing.generateQRCode(webLink, 200, 200);
  QRCode.save(dataPath("")+"/"+"qrcodes.jpg");
  QRCode = null;
  webLink = null;
}

void draw()
{
}

QR-Code lesen

...


    background(0);
    
    video.read();
    image(video, 0, 0);

    // DecodingResult result = Barcode.decodeMulti(video, CHARACTER_SET.DEFAULT, true, DECODE.values());
    DecodingResult result = Barcode.decode(video, CHARACTER_SET.DEFAULT, true, DECODE.QR_CODE);
    // DecodingResult result = Barcode.decode(video, CHARACTER_SET.DEFAULT, true, DECODE.CODE_128);

    if (!result.decodingFailed()) {
      PVector center = getCenter(result);
      float rotation = getRotation(result);

      pushMatrix();
      translate(center.x, center.y);
      rotate(rotation);
      stroke(0);
      strokeWeight(2);
      ellipse(0, 0, 50, 50);
      line(0, 0, -25, 0);
      popMatrix();

      println(degrees(rotation));
    }
  }
}

PVector getCenter(DecodingResult result) {
  PVector returnVector = new PVector(0, 0);

  for (int i = 0; i < result.getCorners ().length; i++) {
    returnVector.x += result.getCorners()[i].x;
    returnVector.y += result.getCorners()[i].y;
  }

  returnVector.x /= result.getCorners().length;
  returnVector.y /= result.getCorners().length;

  return returnVector;
}

float getRotation(DecodingResult result) {
  PVector p1 = new PVector(result.getCorners()[0].x, result.getCorners()[0].y);
  PVector p2 = new PVector(result.getCorners()[1].x, result.getCorners()[1].y);
  PVector p3 = p2.sub(p1);

  return p3.heading()+PI/2;
}

Fiducials

Image Added

Mehr Infos zum lesen von Fiducials findest du hier.