You are viewing an old version of this page. View the current version.
Compare with Current
View Page History
« Previous
Version 7
Next »
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
import diewald_bardcode.*;
import diewald_bardcode.CONSTANTS.*;
int code_size = 500;
String content = "http://iad.zhdk.ch";
void setup()
{
size(code_size, code_size);
EncodingResult result = Barcode.encode(content, ENCODE.QR_CODE, code_size, code_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()
{
}
QR-Code lesen
import diewald_bardcode.*;
import diewald_bardcode.CONSTANTS.*;
import processing.video.*;
Capture video;
void setup()
{
size(1140, 480);
video = new Capture(this, 640, 480, 30);
video.start();
}
void draw() {
if ( video.available() )
{
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);//new PVector(0, 0);
float rotation = getRotation(result);
pushMatrix();
translate(center.x, center.y);
rotate(rotation);
stroke(0);
ellipse(0, 0, 20, 20);
line(0, 0, -10, 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)
{
float returnValue;
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);
returnValue = p3.heading()+PI/2;
return returnValue;
}