树莓派实现人脸打卡机 (2)

这里认为2秒内没有人脸识别信息则认为是空闲。

private void startVideoListener() { new Thread(() -> { while (true) { if (System.currentTimeMillis() - timestamp.get() > 2 * 1000) { Platform.runLater(() -> { video.setImage(DEF_VIDEO_IMAGE); avatar.setImage(DEF_AVA_TAR); uid.setText(""); message.setText(DEF_MESSAGE); }); } try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException ignore) { } } }).start(); }

界面布局

布局采用JavaFX的fxml来设计。

<BorderPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.itqn.raspi.video.VideoController"> <right> <VBox alignment="CENTER" prefWidth="120.0" spacing="20.0" BorderPane.alignment="CENTER"> <children> <ImageView fx:id="avatar" fitHeight="100.0" fitWidth="100.0"/> <HBox alignment="CENTER" prefHeight="40.0"> <Label text="工号 "/> <TextField fx:id="uid" prefWidth="60"/> </HBox> <HBox alignment="CENTER" prefHeight="40.0" spacing="5.0"> <Button onAction="#store" text="存档"/> <Button onAction="#reset" text="采集"/> </HBox> </children> <padding> <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/> </padding> </VBox> </right> <bottom> <HBox alignment="CENTER_LEFT" prefHeight="40.0" spacing="20.0" BorderPane.alignment="CENTER"> <Label text="打开信息:"/> <Label fx:id="message"/> <padding> <Insets bottom="10.0" left="50.0" right="10.0" top="10.0"/> </padding> </HBox> </bottom> <center> <ImageView fx:id="video" fitWidth="320.0" fitHeight="180.0"/> </center> </BorderPane> 5. 程序使用截图

当没有检测到人脸的时候,程序会休眠更长的时间(1秒)以降低CPU的使用率,下面是空闲时的界面。

raspi-face-freetime

用户开始使用的时候,可以通过采集人脸进行工号绑定,下面是采集存档成功的界面。

raspi-face-store

6. 踩坑之旅

由于程序是在Windows环境下开发的,程序开发完成,测试完美通过,然而树莓派是armv7架构的,默认安装的jdk8并不支持JavaFX。
重新开发了一套基于swing的UI,原本的UI应该是这样的:

raspi-face-javafx

不支持JavaFX,有解决办法,不过测试了一下,效果不行,下面是解决方案:

通过下面的地址下载armv6hf-sdk

https://gluonhq.com/products/mobile/javafxports/get/

然后每次启动的时候指定ext模块

java -Djava.ext.dirs=http://www.likecs.com/home/pi/armv6hf-sdk/rt/lib/ext -jar raspi-video.jar

将armv6hf-sdk解压后复制到jre下面,可以通过下面这个地址2.1.4章节查看复制的位置,这种方式不用每次启动都带参数。

https://docs.gluonhq.com/javafxports/

armv6hf-sdk没有SwingFXUtils这个类

解决这个问题比较简单,只需要将SwingFXUtils这个类的源码复制一份即可。

=========================================================
项目源码可关注公众号 “HiIT青年” 发送 “raspi-face” 获取。

!!!基于Swing实现的界面模块也可以在公众号上下载!!!

HiIT青年

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxfsx.html