March 25

RPI3上使用java控制Bluetooth

RPI3上使用java控制Bluetooth一直是自己想实现的功能,今天在外媒(https://robotjava.wordpress.com/2016/09/04/raspberry-pi-3-bluetooth-android-pi4j-part-1/)终于让我找到了方法,现将操作过程简单记录下。RPI3使用最新debian镜像(20170302)作为操作系统,并在3.5TFT上运行系统程序。

Step 1: Enable Bluetooth on the Raspberry Pi 3

sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install piclone geany usb-modeswitch pi-bluetooth
sudo apt-get install python-pigpio python3-pigpio

#this will turn on bluetooth control mode, ie [bluetooth]# sudo bluetoothctl agent on default-agent

安装Android蓝牙应用BlueTerm,与PI3进行蓝牙BLE通讯。

scan on
#You will see the MAC Addresses of nearby devices
Discovery started
[NEW] Controller XX:YY:ZZ:AA:BB:CC #Your Pi's MAC Address
[NEW] Device DD:EE:FF:GG:HH:II     #Your Android's MAC Address

#To pair the phone, replace MAC Address with your own
pair DD:EE:FF:GG:HH:II
[agent] Confirm passkey 123456 (yes/no): yes
[CHG] Device DD:EE:FF:GG:HH:II Modalias: bluetooth:xxxx
[CHG] Device DD:EE:FF:GG:HH:II UUIDs:
<bunch of numbers>
[CHG] Device DD:EE:FF:GG:HH:II Paired: Yes
Pairing successful
[CHG] Device DD:EE:FF:GG:HH:II Connected: No
[CHG] Device DD:EE:FF:GG:HH:II Trusted: Yes

Step 2: Sending and Receiving Serial Data

sudo nano /etc/systemd/system/dbus-org.bluez.service
ExecStart=/usr/lib/bluetooth/bluetoothd -C
ExecStartPost=/usr/bin/sdptool add SP
sudo rfcomm watch hci0

通过命令连接到rfcomm0观察RPI3蓝牙BLE接收到的数据

cat /dev/rfcomm0

2017-03-25_09-52-18

RPI3上接收到的蓝牙BLE数据。

!!!需要注意的是java测试代码必须连接手机APP,并在“sudo rfcomm watch hci0”“cat /dev/rfcomm0”和指令执行之后运行。

Category: JavaFX | LEAVE A COMMENT
February 23

PI3使用官方屏实现javafx触摸功能的实现

今天是一个值得开心的一天,困扰已久的pi3官方屏javafx实现触摸功能终于突破了。现通过操作笔记的形式将实施步骤记录如下:

  1. 1.下载jdk和openjdk,目前选择的版本为jdk-8u111-linux-arm32-vfp-hflt.tar.gz和armv6hf-sdk-8.60.8.zip。

    11

  2. 2.通过ftp上传至pi3,并解压,形成两个目录为jdk1.8.0_111和armv6hf-sdk。

    1

    2

  3. 3.修改linux中java的环境变量,在命令行中:sudo nano /etc/profile 对环境变量进行设置,在profile最后插入export PATH=/home/ubuntu/Java/jdk1.8.0_06/bin:$PATH保存退出,然后进行source /etc/profile 对环境变量生效,通过java –version 进行版本查看。

    3

  4. 4.java环境变量生效后,需要将openjdk加入到java运行命令中,这样可以实现触摸功能的实现,功能脚本参考原有runfxapp脚本,新功能脚本重新定义为runfxapp_touch,并将其复制至/usr/local/bin/目录下。

    COMMAND=”sudo java -Dcom.sun.javafx.touch=true -Dcom.sun.javafx.isEmbedded=true -Dcom.sun.javafx.vk.adjustwindow=true -Dcom.sun.javafx.virtualKeyboard=javafx -Djava.ext.dirs=/home/pi/armv6hf-sdk/rt/lib/ext -cp .:/home/pi/Rec/Servo_Handle.jar ScreensFramework”

    4

  5. 5.创建新的自动运行脚本auto_touch。

    export JAVA_HOME=/home/pi/Java/jdk1.8.0_111

    /usr/local/bin/runfxapp_touch -j /home/pi/Rec/Servo_Handle.jar ScreensFramework &

  6. 6.至此运行javafx程序可支持touch功能,运行Servo_Handle.jar其CPU占用率较理想。

    5

  7. 7.javafx触摸功能的实现将拓宽应用实用的范围,为更好的人机交互性能提供了卓越性能的提升。

Category: JavaFX | LEAVE A COMMENT
November 26

使用opencv2.4.13进行人脸识别测试

1.使用opencv2.4.13进行人脸图片的静态识别测试。

2.安装opencv开发环境,下载opencv2.4.13,解压之后得到文件夹opencv。

3.在Eclipse下添加jar路径,如图:

eclipse_2016-11-26_14-41-48

4.编辑opencv-2413.jar的Native Library,如图:

eclipse_2016-11-26_14-45-28

5.配置完成。

6.测试代码为:

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;

public class FaceDetector {

    public static void main(String[] args) {

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        System.out.println(“\nRunning FaceDetector”);
        //System.out.println(FaceDetector.class.getResource(“lbpcascade_frontalface.xml”).getPath());

        String url0 = FaceDetector.class.getResource(“lbpcascade_frontalface.xml”).getPath();
        if (url0.startsWith(“/”, 0))
            url0=url0.replaceFirst(“/”, “”);
        try {
            url0=URLDecoder.decode(url0, “UTF-8”);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } //this will replace %20 with spaces
        CascadeClassifier faceDetector = new CascadeClassifier(url0);

        String url1 = FaceDetector.class.getResource(“run.jpg”).getPath();
        if (url1.startsWith(“/”, 0))
           url1=url1.replaceFirst(“/”, “”);
        try {
            url1=URLDecoder.decode(url1, “UTF-8”);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } //this will replace %20 with spaces
        Mat image = Highgui.imread(url1);

//        Mat image = Highgui
//                .imread(FaceDetector.class.getResource(“test.jpg”).getPath());

        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(image, faceDetections);

        System.out.println(String.format(“Detected %s faces”, faceDetections.toArray().length));

        for (Rect rect : faceDetections.toArray()) {
            Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
                    new Scalar(0, 255, 0));
        }

        String filename = “dingxiao.png”;
        System.out.println(String.format(“Writing %s”, filename));
        Highgui.imwrite(filename, image);
    }
}

7.测试结果,图中绿色框为人脸识别结果,识别的准确率不是很高。

result