Java手势识别是一种基于计算机视觉技术的应用,它可以通过摄像头或其他图像传感器来识别人的手势。它可以用来控制计算机,操作电子设备,或者用于人机交互。
Java手势识别的原理是通过对图像中的特征进行分析,然后将其映射到一个数字表示中。例如,当你在使用手势识别时,你可能会看到一个图像中的特征如手掌、手指、手腕等。然后,这些特征将被映射到一个数字表示中,以便实现对不同手势的识别。
// Java代码实例 public class HandGestureRecognition { public static void main(String[] args) { // 初始化图像传感器 ImageSensor imageSensor = new ImageSensor(); // 读取图像数据 ImageData imageData = imageSensor.readImageData(); // 初始化特征检测器 FeatureDetector featureDetector = new FeatureDetector(); // 检测图像中的特征 Listfeatures = featureDetector.detectFeatures(imageData); // 初始化手势识别引擎 GestureRecognitionEngine gestureRecognitionEngine = new GestureRecognitionEngine(); // 识别出图像中的手势 List gestures = gestureRecognitionEngine.recognizeGestures(features); } }
JavaFX可以处理来自触摸使能设备的触摸和手势的事件。
支持触摸启用设备的以下事件
手势 | 描述 |
---|---|
Rotate | Triggered when using two-finger to rotate objects.
它触发以下事件
|
Scroll | Sliding movement. 如果鼠标滚轮用于滚动,则仅生成类型为SCROLL的事件。它触发以下事件:
|
Swipe |
在屏幕上扫描运动。 |
Zoom | 由双指缩放。它会启动以下事件: |
import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.input.MouseEvent; import javafx.scene.input.RotateEvent; import javafx.scene.input.ScrollEvent; import javafx.scene.input.SwipeEvent; import javafx.scene.input.TouchEvent; import javafx.scene.input.ZoomEvent; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage primaryStage) { Group root = new Group(); Scene scene = new Scene(root, 300, 250); Rectangle rect = new Rectangle(); rect.setWidth(100); rect.setHeight(100); root.getChildren().add(rect); rect.setOnScroll(new EventHandler<ScrollEvent>() { @Override public void handle(ScrollEvent event) { if (!event.isInertia()) { rect.setTranslateX(rect.getTranslateX() + event.getDeltaX()); rect.setTranslateY(rect.getTranslateY() + event.getDeltaY()); } System.out.println("Rectangle: Scroll event" + ", inertia: " + event.isInertia() + ", direct: " + event.isDirect()); event.consume(); } }); rect.setOnScrollStarted(new EventHandler<ScrollEvent>() { @Override public void handle(ScrollEvent event) { System.out.println("Rectangle: Scroll started event"); event.consume(); } }); rect.setOnScrollFinished(new EventHandler<ScrollEvent>() { @Override public void handle(ScrollEvent event) { System.out.println("Rectangle: Scroll finished event"); event.consume(); } }); rect.setOnZoom(new EventHandler<ZoomEvent>() { @Override public void handle(ZoomEvent event) { rect.setScaleX(rect.getScaleX() * event.getZoomFactor()); rect.setScaleY(rect.getScaleY() * event.getZoomFactor()); System.out.println("Rectangle: Zoom event" + ", inertia: " + event.isInertia() + ", direct: " + event.isDirect()); event.consume(); } }); rect.setOnZoomStarted(new EventHandler<ZoomEvent>() { @Override public void handle(ZoomEvent event) { System.out.println("Rectangle: Zoom event started"); event.consume(); } }); rect.setOnZoomFinished(new EventHandler<ZoomEvent>() { @Override public void handle(ZoomEvent event) { System.out.println("Rectangle: Zoom event finished"); event.consume(); } }); rect.setOnRotate(new EventHandler<RotateEvent>() { @Override public void handle(RotateEvent event) { rect.setRotate(rect.getRotate() + event.getAngle()); System.out.println("Rectangle: Rotate event" + ", inertia: " + event.isInertia() + ", direct: " + event.isDirect()); event.consume(); } }); rect.setOnRotationStarted(new EventHandler<RotateEvent>() { @Override public void handle(RotateEvent event) { System.out.println("Rectangle: Rotate event started"); event.consume(); } }); rect.setOnRotationFinished(new EventHandler<RotateEvent>() { @Override public void handle(RotateEvent event) { System.out.println("Rectangle: Rotate event finished"); event.consume(); } }); rect.setOnSwipeRight(new EventHandler<SwipeEvent>() { @Override public void handle(SwipeEvent event) { System.out.println("Rectangle: Swipe right event"); event.consume(); } }); rect.setOnSwipeLeft(new EventHandler<SwipeEvent>() { @Override public void handle(SwipeEvent event) { System.out.println("Rectangle: Swipe left event"); event.consume(); } }); rect.setOnTouchPressed(new EventHandler<TouchEvent>() { @Override public void handle(TouchEvent event) { System.out.println("Rectangle: Touch pressed event"); event.consume(); } }); rect.setOnTouchReleased(new EventHandler<TouchEvent>() { @Override public void handle(TouchEvent event) { System.out.println("Rectangle: Touch released event"); event.consume(); } }); rect.setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { if (event.isSynthesized()) { System.out.println("Ellipse: Mouse pressed event from touch" + ", synthesized: " + event.isSynthesized()); } event.consume(); } }); rect.setOnMouseReleased(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { if (event.isSynthesized()) { System.out.println("Ellipse: Mouse released event from touch" + ", synthesized: " + event.isSynthesized()); } event.consume(); } }); primaryStage.setScene(scene); primaryStage.show(); } }
上面的代码生成以下结果。
Java 实例 - 利用堆栈将中缀表达式转换成后缀表达式 Java 实例以下实例演示了如何使用堆栈进行表达式的堆栈将中缀(Infix)表达...
Java 实例 - 数字求和运算 Java 实例以下实例演示了使用do...while结构求0~100的整数数字之和:public class Main {public stati...
Java Hashtable 接口 Hashtable是原始的java.util的一部分, 是一个Dictionary具体的实现 。 然而,Java 2 重构的Hashtable实现...