Clojure에서 Kinect를 만지십시오.

14048 단어 AdventCalendarClojure
Clojure라고 하면 Web계의 이야기가 많은 느낌이 듭니다만, Clojure에서 Kinect 또는 AR.Drone을 사용하는 사람 도 있는 것 같습니다.

사용 라이브러리



Clojure의 라이브러리로는 QuilBifocals 을 사용합니다. Bifocals는 OpenNI을 사용하므로 OpenNI 설치도 필요합니다.

Quil



Quil처리 의 Clojure 래퍼입니다.

간결한 코드로 도형을 그릴 수 있는 등, 그래픽적인 출력을 얻을 수 있습니다. 이번에는 Bifocals에서 얻은 Kinect 데이터를 그리는 데 사용합니다.

최신 버전은 1.6.0입니다.

project.clj
[quil "1.6.0"]

Bifocals



Bifocals은 Clojure에서 Kinect를 다루는 라이브러리입니다.

Processing에는 simple-openni이라는 유명한 OpenNI 래퍼 라이브러리가 있습니다. Bifocals는 simple-openni의 래퍼 같은 느낌입니다.

최신 버전은 0.1.0입니다.

project.clj
[bifocals "0.1.0"]

OpenNI



OpenNI 은 3D 센서용 오픈 소스 SDK입니다. Kinect뿐만 아니라 다양한 3D 센서에 사용할 수 있습니다.

OpenNI는 현재 버전 2 계열이지만, 이번 기사에서는 v1.5.2.23을 사용하고 있습니다. Bifocals에서 OpenNI2를 사용할 수 있는지 확인하지 않았습니다.

OpenNI의 설치 방법은 구그면 여러가지 나오므로 그쪽을 참조해 주세요. 그건 그렇고, Mac + Homebrew 환경이라면 내가 만든 homebrew-openni을 사용하면 쉽습니다! (스테마)

Kinect 방문


ns에 Quil과 Bifocals를 추가합니다.
(ns cljac16.core
  (:require [quil.core :refer :all]
            [bifocals.core :as bifocals]))
setup 함수와 스케치의 정의는 다음과 같습니다.
(defn setup []
  (smooth)
  (frame-rate 30))

(defsketch kinect
  :title "Can Haz Kinect!"
  :setup setup
  :draw draw
  :size [640 480])

Depth



거리 이미지를 가져오고 표시하려면 draw 함수에 다음과 같이 씁니다.
(defn draw []
  (background 0)
  (bifocals/tick)
  (image (bifocals/depth-image) 0 0))
draw 함수 내에서 반드시 bifocals.core/tick 를 호출해야 합니다. tick 함수는 Kinect 데이터를 업데이트하므로 매 프레임을 호출합니다.
bifocals.core/depth-image는 거리 이미지를 Processing의 PImage 인스턴스로 반환합니다. quil.core/image 에 의해 거리 이미지를 표시합니다.



해골 추적


(defn- draw-line
  [p1 p2]
  (line (:x p1) (:y p1) (:x p2) (:y p2)))

(defn- draw-skeleton
  [skeleton]
  (let [{:keys [head neck left-shoulder right-shoulder left-elbow right-elbow
                left-hand right-hand torso left-hip right-hip left-knee
                right-knee left-foot right-foot]}
        (bifocals/project-skeleton skeleton)]
    (stroke 30 120 180)
    (stroke-weight 3)
    (draw-line head neck)
    (draw-line neck left-shoulder), (draw-line neck right-shoulder)
    (draw-line left-shoulder left-elbow), (draw-line right-shoulder right-elbow)
    (draw-line left-elbow left-hand), (draw-line right-elbow right-hand)
    (draw-line left-shoulder torso), (draw-line right-shoulder torso)
    (draw-line torso left-hip), (draw-line torso right-hip)
    (draw-line left-hip left-knee), (draw-line right-hip right-knee)
    (draw-line left-knee left-foot), (draw-line right-knee right-foot)))

(defn draw []
  (background 0)
  (bifocals/tick)
  (image (bifocals/depth-image) 0 0)
  (doseq [skeleton (vals @bifocals/skeletons)]
    (draw-skeleton skeleton)))
bifocals.core/skeletons 라는 atom에 화면내에 들어가 있는 인물의 스켈레톤 데이터가 들어 있으므로, 그것을 꺼내 그리기 하고 있습니다.

또한 bifocals.core/project-skeleton 함수는 3D 스켈레톤 좌표를 2D 카메라 좌표계로 변환합니다.



소감



꽤 쉽게 Kinect에 액세스 할 수있었습니다. 이번 기사에서는 거리 화상과 스켈레톤 정보의 취득만을 소개했습니다만, Bifocals의 example 에서는 사람의 수를 검출하는 방법등도 포함되어 있습니다.

조금 신경이 쓰이는 점으로는, Quil나 Bifocals는 최근에는 갱신되어 있지 않고, Processing이나 simple-openni에 추종할 수 없는 것 같습니다. 하지만 Clojure는 Java에 쉽게 액세스 할 수 있으므로 Bifocals를 사용하지 않고 직접 OpenNI의 Java 바인딩을 호출 할 수 있다고 생각합니다.

Kinect나 AR.Drone, Arduino등을 다루는 피지컬 컴퓨팅의 세계에도 Clojure가 더욱 진출해 주면 좋다고 생각합니다.

좋은 웹페이지 즐겨찾기