sample_mediapipe_hand.hsp

sample\iron\sample_mediapipe_hand.hsp » Plain Format

;============================================================
;   sample_mediapipe_hand.hsp — MediaPipe Hand 検出サンプル
;
;   hsptflite.dll (Tensorflow Lite C API + MediaPipe helpers) と
;   iron_mediapipe.hsp を使って、画像から手のひらを検出し、
;   21 点 landmark を重ねて描画するデモです。
;
;   配置:
;     mediapipe_models/hand_detector.tflite
;     mediapipe_models/hand_landmarks_detector.tflite
;     mediapipe_models/tensorflowlite_c.dll
;     mediapipe_models/hand.jpg                (任意の手の写真)
;============================================================

#include "hsp3_net_64.as"
#include "iron_mediapipe.hsp"

    title "MediaPipe Hand Detection (IronHSP)"
    screen 0, 800, 600

    ; --- 画像読み込み ---
    picload "mediapipe_models/hand.jpg"
    src_w = ginfo_winx
    src_h = ginfo_winy

    ; --- bmscr から 24bit DIB を取得 ---
    mref bm, 67
    sdim bgr, src_w * src_h * 3
    memcpy bgr, bm, src_w * src_h * 3, 0, 0

    ; HSP の DIB は上下反転 & BGR。上下反転 + BGR→RGB を
    ; 一度に処理するため、まず y 方向に flip してから mp_bgr_to_rgbsdim bgr_flip, src_w * src_h * 3
    repeat src_h
        memcpy bgr_flip, bgr, src_w * 3, cnt * src_w * 3, (src_h - 1 - cnt) * src_w * 3
    loop
    sdim rgb, src_w * src_h * 3
    mp_bgr_to_rgb bgr_flip, src_w, src_h, rgb

    ; --- MediaPipe Hand 初期化 ---
    mp_hand_init "mediapipe_models/hand_detector.tflite", "mediapipe_models/hand_landmarks_detector.tflite"
    if stat < 0 {
        color 255, 0, 0
        pos 10, 10
        mes "mp_hand_init failed: stat=" + stat
        mes "(SDK 未配置または tensorflowlite_c.dll が見つかりません)"
        stop
    }

    ; --- 検出実行 ---
    mp_hand_run rgb, src_w, src_h
    nhand = stat

    ; --- 結果の描画 ---
    repeat nhand
        i = cnt
        mp_hand_bbox_xyxy i, bx1, by1, bx2, by2
        mp_hand_score    i, sc
        mp_hand_presence i, pc

        color 0, 255, 0
        boxf bx1, by1, bx2, by1 + 2
        boxf bx1, by1, bx1 + 2, by2
        boxf bx2 - 2, by1, bx2, by2
        boxf bx1, by2 - 2, bx2, by2

        pos bx1, by1 - 16
        color 255, 255, 0
        mes strf("hand[%d] score=%.2f pres=%.2f", i, sc, pc)

        ; 21 点 landmark
        color 255, 0, 255
        repeat 21
            mp_hand_landmark_pt i, cnt, lx, ly
            circle lx - 3, ly - 3, lx + 3, ly + 3, 1
        loop
    loop

    color 255, 255, 255
    pos 10, src_h + 4
    mes "detected hands: " + nhand

    mp_hand_close
    stop