初めての軽井沢、そして北陸新幹線。白糸の滝、特徴あるけど思ってたよりずっと小さい。ようやく秋らしくなったと思ったら、もう冬ぽい。


旅とガジェットとその他
台風で中止になった技術士一次試験(東京・神奈川会場)だが、どうやら再試験をやってくれるようだ。年1回の試験で完全中止はやはりクレームが相当あったのだろう。再試験とは言っても来年3月7日かぁ。先が長いが、今度はもうちょっとちゃんと勉強しよう。ちなみに受けるのは情報工学で、高度情報処理技術者持ちは専門科目が免除される。情報処理技術者が初めて役に立つ(笑)
9月でいったん終わったSonyのキャッシュバックが11月からまだ再開されている。FE24-105F4やFE85F18も9月末に買ったのでちょっと悔しい。特にFE85F18の価格帯に対して1万円のキャッシュバックには驚かされた。
ちょっと仕事で画像処理を使う機会が出たので、学生実験以来にOpenCVに触ってみる。静的型付けではないPythonは嫌いで、今更C++で頑張るのもきついので、Javaでやってみた。公式にサポートされているのは、この3つのようだが、Javaに関する情報は少ないので、テストコードを載せてみる。
公式にJava対応のラッパーが用意されているが、Gradleで入らないので、JavaCVを使用することにした。
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を指定すれば瞳認識もできる。ちょっと試した感じでは顔認識は結構優秀だが、瞳認識は余計なところまで検出される場合が結構あるようだ。それにしてもこんなに簡単にできるのはすごい。