技術士一次試験の再試験が決定

台風で中止になった技術士一次試験(東京・神奈川会場)だが、どうやら再試験をやってくれるようだ。年1回の試験で完全中止はやはりクレームが相当あったのだろう。再試験とは言っても来年3月7日かぁ。先が長いが、今度はもうちょっとちゃんと勉強しよう。ちなみに受けるのは情報工学で、高度情報処理技術者持ちは専門科目が免除される。情報処理技術者が初めて役に立つ(笑)

9月でいったん終わったSonyのキャッシュバックが11月からまだ再開されている。FE24-105F4やFE85F18も9月末に買ったのでちょっと悔しい。特にFE85F18の価格帯に対して1万円のキャッシュバックには驚かされた。

Java + OpenCVでWebカメラ映像のリアルタイム顔認識をしてみる

ちょっと仕事で画像処理を使う機会が出たので、学生実験以来にOpenCVに触ってみる。静的型付けではないPythonは嫌いで、今更C++で頑張るのもきついので、Javaでやってみた。公式にサポートされているのは、この3つのようだが、Javaに関する情報は少ないので、テストコードを載せてみる。

公式にJava対応のラッパーが用意されているが、Gradleで入らないので、JavaCVを使用することにした。

build.gradleのdependenciesに追加
implementation group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.1'
テストコード
import java.util.Arrays;
import org.bytedeco.opencv.global.opencv_highgui;
import org.bytedeco.opencv.global.opencv_imgproc;
import org.bytedeco.opencv.opencv_core.Mat;
import org.bytedeco.opencv.opencv_core.RectVector;
import org.bytedeco.opencv.opencv_core.Scalar;
import org.bytedeco.opencv.opencv_objdetect.CascadeClassifier;
import org.bytedeco.opencv.opencv_videoio.VideoCapture;

public class DetectionTest {

    public static void main(String[] args) {

        // 分類器
        // https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
        String faceCascade = "C:\\haarcascades\\haarcascade_frontalface_default.xml";
        CascadeClassifier faceDetector = new CascadeClassifier(faceCascade);

        // Webカメラの読み込み(普通はID:0のようだ)
        VideoCapture cap = new VideoCapture(0);

        Mat frame = new Mat();

        // 動画から1フレームを抽出
        while (cap.read(frame)) {
            // 一応コピーを作成
            Mat out = new Mat(frame);
            // 検出結果の収納先(Rectの集合クラス)
            RectVector detected = new RectVector();
            // 検出処理
            faceDetector.detectMultiScale(frame, detected);
            // 検出結果の範囲を描画
            Arrays.stream(detected.get()).forEach(r -> opencv_imgproc.rectangle(out, r, new Scalar(0, 255, 0, 0)));
            // GUIに表示
            opencv_highgui.imshow("Web camera", out);
            // キーボードのqが押されたら終了
            int key = opencv_highgui.waitKey(1);
            if (key == 'q') {
                break;
            }
        }
        // リソースのクローズ
        cap.release();
        opencv_highgui.destroyAllWindows();
    }
}

分類器にhaarcascade_eye.xmlを指定すれば瞳認識もできる。ちょっと試した感じでは顔認識は結構優秀だが、瞳認識は余計なところまで検出される場合が結構あるようだ。それにしてもこんなに簡単にできるのはすごい。