Muiscontrole overnemen
In de vorige les hebben we gezien hoe je handbeweging kan detecteren. Als je onderstaande code wil gebruiken, volg dan eerst de installatiestappen van de vorige les.
Met de onderstaande code kan je de muiscursor (van het ganse computersysteem) jouw handbeweging laten volgen.
import gab.opencv.*;
import processing.video.*;
import oscP5.*;
import netP5.*;
import java.awt.Robot;
import java.awt.AWTException;
import java.awt.Rectangle;
Capture cam;
OpenCV opencv;
OscP5 oscP5;
NetAddress oscDest;
Robot robot;
// Globale variabele om de vorige breedte van de hand op te slaan
int previousHandWidth = 0;
void setup() {
size(640, 480);
// Webcam instellen
cam = new Capture(this, 640, 480);
cam.start();
// OpenCV instellen
opencv = new OpenCV(this, 640, 480);
opencv.loadCascade(OpenCV.CASCADE_HAND); // Gebruik ingebouwde hand-cascade
// OSC instellen
oscP5 = new OscP5(this, 12000); // Luisterpoort
oscDest = new NetAddress("127.0.0.1", 6448); // OSC-doeladres
// Robot instellen voor muiscontrole
try {
robot = new Robot();
} catch (AWTException e) {
println("Robot kan niet worden geïnitialiseerd: " + e.getMessage());
}
}
void draw() {
if (cam.available()) {
cam.read();
}
image(cam, 0, 0);
// Handdetectie uitvoeren
opencv.loadImage(cam);
Rectangle[] hands = opencv.detect();
noFill();
stroke(0, 255, 0);
for (int i = 0; i < hands.length; i++) {
rect(hands[i].x, hands[i].y, hands[i].width, hands[i].height);
// OSC-bericht verzenden
OscMessage msg = new OscMessage("/hand/position");
msg.add(hands[i].x); // X-positie van de hand
msg.add(hands[i].y); // Y-positie van de hand
oscP5.send(msg, oscDest);
// Muispositie bijwerken
float mouseXPos = map(hands[i].x, 0, width, 0, displayWidth);
float mouseYPos = map(hands[i].y, 0, height, 0, displayHeight);
robot.mouseMove((int) mouseXPos, (int) mouseYPos);
// Controleer op een specifiek gebaar - in dit geval een kleiner handgebied (bijvoorbeeld een vuist)
if (hands[i].width < 50 && previousHandWidth >= 50) { // Gebaar: breedte kleiner dan 50 (bijvoorbeeld bij een vuist)
// Simuleer een muisklik
robot.mousePress(java.awt.event.InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(java.awt.event.InputEvent.BUTTON1_DOWN_MASK);
}
// Update vorige breedte
previousHandWidth = hands[i].width;
}
}