คำแนะนำในการจดจำท่าทางสัมผัสสำหรับ Android

งานโปรแกรมจดจำท่าทางสัมผัสของ MediaPipe ช่วยให้คุณจดจำท่าทางสัมผัสของมือได้แบบเรียลไทม์ และแสดงผลลัพธ์ท่าทางสัมผัสด้วยมือที่รู้จักและจุดสังเกตของมือที่ตรวจพบ คำแนะนำเหล่านี้จะแสดงวิธีใช้ การจดจำท่าทางสัมผัสกับแอป Android ตัวอย่างโค้ดที่อธิบายในวิธีการเหล่านี้จะดูได้ใน GitHub

คุณดูงานนี้ในการใช้งานจริงได้โดยดูการสาธิตบนเว็บ ดูข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่าของงานนี้ได้ที่ภาพรวม

ตัวอย่างโค้ด

โค้ดตัวอย่างงาน MediaPipe Tasks เป็นการใช้งานแอปการจดจำท่าทางสัมผัสสำหรับ Android แบบง่ายๆ ตัวอย่างนี้ใช้กล้องบนอุปกรณ์ Android จริงเพื่อตรวจจับท่าทางสัมผัสของมืออย่างต่อเนื่อง และยังใช้รูปภาพและวิดีโอจากแกลเลอรีอุปกรณ์เพื่อตรวจจับท่าทางสัมผัสแบบคงที่ได้ด้วย

คุณสามารถใช้แอปเป็นจุดเริ่มต้นสำหรับแอป Android ของคุณเองหรืออ้างอิงถึงแอปเมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างการจดจำท่าทางสัมผัสโฮสต์อยู่ใน GitHub

ดาวน์โหลดโค้ด

วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาโค้ดตัวอย่างในเครื่องโดยใช้เครื่องมือบรรทัดคำสั่ง git

วิธีดาวน์โหลดโค้ดตัวอย่าง

  1. โคลนที่เก็บ Git โดยใช้คำสั่งต่อไปนี้
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. (ไม่บังคับ) กำหนดค่าอินสแตนซ์ Git เพื่อใช้การชำระเงินแบบกะทัดรัด เพื่อให้คุณมีเฉพาะไฟล์สำหรับแอปตัวอย่างการจดจำท่าทางสัมผัส ดังนี้
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/gesture_recognizer/android
    

หลังจากสร้างโค้ดตัวอย่างเวอร์ชันในเครื่องแล้ว คุณจะนำเข้าโปรเจ็กต์ไปยัง Android Studio และเรียกใช้แอปได้ โปรดดูวิธีการที่หัวข้อคู่มือการตั้งค่าสำหรับ Android

องค์ประกอบหลัก

ไฟล์ต่อไปนี้มีโค้ดที่สำคัญสำหรับแอปพลิเคชันตัวอย่าง การจดจำท่าทางสัมผัสด้วยมือนี้

  • GestureRecognizerHelper.kt - เริ่มต้นเครื่องมือจดจำท่าทางสัมผัสและจัดการโมเดลและมอบสิทธิ์การเลือก
  • MainActivity.kt - ใช้งานแอปพลิเคชัน รวมถึงการเรียกใช้ GestureRecognizerHelper และ GestureRecognizerResultsAdapter
  • GestureRecognizerResultsAdapter.kt - จัดการและจัดรูปแบบผลการค้นหา

ตั้งค่า

ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมการพัฒนาและโปรเจ็กต์โค้ดเพื่อใช้การจดจำท่าทางสัมผัสโดยเฉพาะ ดูข้อมูลทั่วไปเกี่ยวกับการตั้งค่าสภาพแวดล้อมการพัฒนาเพื่อใช้งาน MediaPipe รวมถึงข้อกำหนดเวอร์ชันแพลตฟอร์มได้ที่คำแนะนำการตั้งค่าสำหรับ Android

การอ้างอิง

งานการจดจำท่าทางสัมผัสใช้ไลบรารี com.google.mediapipe:tasks-vision เพิ่มทรัพยากร Dependency นี้ไปยังไฟล์ build.gradle ของแอป Android:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

รุ่น

งาน MediaPipe Gesture Recognizer ต้องใช้แพ็กเกจโมเดลที่ผ่านการฝึกแล้วซึ่งเข้ากันได้กับงานนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกที่พร้อมใช้งานสำหรับโปรแกรมจดจำท่าทางสัมผัสได้ในภาพรวมงานส่วนโมเดล

เลือกและดาวน์โหลดโมเดล แล้วจัดเก็บไว้ในไดเรกทอรีโปรเจ็กต์ของคุณ ดังนี้

<dev-project-root>/src/main/assets

ระบุเส้นทางของโมเดลภายในพารามิเตอร์ ModelAssetPath ในโค้ดตัวอย่าง โมเดลจะได้รับการกำหนดในไฟล์ GestureRecognizerHelper.kt ดังนี้

baseOptionBuilder.setModelAssetPath(MP_RECOGNIZER_TASK)

สร้างงาน

งาน MediaPipe Gesture Recognizer ใช้ฟังก์ชัน createFromOptions() เพื่อตั้งค่างาน ฟังก์ชัน createFromOptions() จะยอมรับค่าสำหรับตัวเลือกการกำหนดค่า ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกำหนดค่าได้ในตัวเลือกการกำหนดค่า

การจดจำท่าทางสัมผัสรองรับอินพุต 3 ประเภท ได้แก่ ภาพนิ่ง ไฟล์วิดีโอ และสตรีมวิดีโอสด คุณต้องระบุโหมดการทำงานที่เกี่ยวข้องกับประเภทข้อมูลอินพุตเมื่อสร้างงาน เลือกแท็บที่ตรงกับประเภทข้อมูลอินพุตเพื่อดูวิธีสร้างงานและใช้การอนุมาน

รูปภาพ

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    GestureRecognizer.GestureRecognizerOptions.builder()
        .setBaseOptions(baseOptions)
        .setMinHandDetectionConfidence(minHandDetectionConfidence)
        .setMinTrackingConfidence(minHandTrackingConfidence)
        .setMinHandPresenceConfidence(minHandPresenceConfidence)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()
gestureRecognizer =
    GestureRecognizer.createFromOptions(context, options)
    

วิดีโอ

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    GestureRecognizer.GestureRecognizerOptions.builder()
        .setBaseOptions(baseOptions)
        .setMinHandDetectionConfidence(minHandDetectionConfidence)
        .setMinTrackingConfidence(minHandTrackingConfidence)
        .setMinHandPresenceConfidence(minHandPresenceConfidence)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()
gestureRecognizer =
    GestureRecognizer.createFromOptions(context, options)
    

สตรีมแบบสด

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    GestureRecognizer.GestureRecognizerOptions.builder()
        .setBaseOptions(baseOptions)
        .setMinHandDetectionConfidence(minHandDetectionConfidence)
        .setMinTrackingConfidence(minHandTrackingConfidence)
        .setMinHandPresenceConfidence(minHandPresenceConfidence)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()
gestureRecognizer =
    GestureRecognizer.createFromOptions(context, options)
    

การใช้โค้ดตัวอย่างการจดจำท่าทางสัมผัสช่วยให้ผู้ใช้สลับไปมาระหว่างโหมดการประมวลผลข้อมูลได้ วิธีนี้ทำให้โค้ดการสร้างงานซับซ้อนขึ้นและอาจไม่เหมาะกับกรณีการใช้งานของคุณ คุณดูโค้ดนี้ได้ในฟังก์ชัน setupGestureRecognizer() ในไฟล์ GestureRecognizerHelper.kt

ตัวเลือกการกำหนดค่า

งานมีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอป Android

ชื่อตัวเลือก คำอธิบาย ช่วงของค่า ค่าเริ่มต้น
runningMode ตั้งค่าโหมดการทำงาน มี 3 โหมดดังนี้

IMAGE: โหมดสำหรับการป้อนข้อมูลรูปภาพเดียว

วิดีโอ: โหมดสำหรับเฟรมที่ถอดรหัสของวิดีโอ

LIVE_Stream: โหมดสำหรับสตรีมแบบสดของข้อมูลอินพุต เช่น จากกล้อง ในโหมดนี้ ต้องมีการเรียกใช้ resultsListener เพื่อตั้งค่า Listener เพื่อรับผลลัพธ์แบบไม่พร้อมกัน
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
numHands GestureRecognizer ตรวจพบมือถึงจำนวนสูงสุดแล้ว Any integer > 0 1
minHandDetectionConfidence คะแนนความเชื่อมั่นขั้นต่ำสำหรับการตรวจจับมือที่จะถือว่าประสบความสำเร็จในโมเดลการตรวจจับฝ่ามือ 0.0 - 1.0 0.5
minHandPresenceConfidence คะแนนความเชื่อมั่นขั้นต่ำของคะแนนการแสดงตัวของมือในโมเดลการตรวจจับจุดสังเกตของมือ ในโหมดวิดีโอและโหมดสตรีมแบบสดของโปรแกรมจดจำท่าทางสัมผัส หากคะแนนความมั่นใจของมือจากโมเดลจุดสังเกตของมืออยู่ต่ำกว่าเกณฑ์นี้ โมเดลการตรวจจับฝ่ามือจะทริกเกอร์ มิเช่นนั้น จะใช้อัลกอริทึมการติดตามมือน้ำหนักเบาเพื่อระบุตำแหน่งของมือสำหรับการตรวจจับจุดสังเกตที่ตามมา 0.0 - 1.0 0.5
minTrackingConfidence คะแนนความเชื่อมั่นขั้นต่ำสำหรับการติดตามมือจะถือว่าประสบความสำเร็จ นี่คือเกณฑ์ IoU ของกรอบล้อมรอบระหว่างมือในเฟรมปัจจุบันและเฟรมสุดท้าย ในโหมดวิดีโอและโหมดสตรีมของ การจดจำท่าทางสัมผัส หากการติดตามล้มเหลว การจดจำท่าทางสัมผัสจะทริกเกอร์การตรวจจับมือ ไม่เช่นนั้นระบบจะข้ามการตรวจจับมือ 0.0 - 1.0 0.5
cannedGesturesClassifierOptions ตัวเลือกสำหรับการกำหนดค่าการทำงานของตัวแยกประเภทท่าทางสัมผัสสำเร็จรูป ท่าทางสัมผัสสำเร็จรูปคือ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"]
  • ภาษาของชื่อที่แสดง: ภาษาที่จะใช้สำหรับชื่อที่แสดงที่ระบุผ่านข้อมูลเมตาของโมเดล TFLite หากมี
  • ผลลัพธ์สูงสุด: จำนวนสูงสุดของผลลัพธ์การจัดประเภทที่มีคะแนนสูงสุดที่จะแสดง หาก < 0 ระบบจะแสดงผลทั้งหมดที่มี
  • เกณฑ์คะแนน: คะแนนด้านล่างที่ผลลัพธ์ถูกปฏิเสธ หากตั้งค่าเป็น 0 ระบบจะแสดงผลลัพธ์ที่มีอยู่ทั้งหมด
  • รายการที่อนุญาตของหมวดหมู่: รายการที่อนุญาตสำหรับชื่อหมวดหมู่ หากไม่ว่างเปล่า ผลลัพธ์การจัดประเภทที่หมวดหมู่ไม่อยู่ในชุดนี้จะถูกกรองออก ใช้กับรายการที่ปฏิเสธได้พร้อมกัน
  • รายการหมวดหมู่ที่ปฏิเสธ: รายการที่ปฏิเสธของชื่อหมวดหมู่ หากไม่ว่างเปล่า ผลลัพธ์การจัดประเภทที่มีหมวดหมู่ในชุดนี้จะถูกกรองออก พิเศษเฉพาะที่มาพร้อมกับรายการที่อนุญาต
    • ภาษาของชื่อที่แสดง: any string
    • ผลลัพธ์สูงสุด: any integer
    • เกณฑ์คะแนน: 0.0-1.0
    • รายการที่อนุญาตของหมวดหมู่: vector of strings
    • รายการหมวดหมู่ที่ไม่อนุญาต: vector of strings
    • ภาษาของชื่อที่แสดง: "en"
    • ผลลัพธ์สูงสุด: -1
    • เกณฑ์คะแนน: 0
    • รายการที่อนุญาตของหมวดหมู่: ว่างเปล่า
    • รายการหมวดหมู่ที่ปฏิเสธ: ว่างเปล่า
    customGesturesClassifierOptions ตัวเลือกสำหรับการกำหนดค่าการทำงานของตัวแยกประเภทท่าทางสัมผัสที่กำหนดเอง
  • ภาษาของชื่อที่แสดง: ภาษาที่จะใช้สำหรับชื่อที่แสดงที่ระบุผ่านข้อมูลเมตาของโมเดล TFLite หากมี
  • ผลลัพธ์สูงสุด: จำนวนสูงสุดของผลลัพธ์การจัดประเภทที่มีคะแนนสูงสุดที่จะแสดง หาก < 0 ระบบจะแสดงผลทั้งหมดที่มี
  • เกณฑ์คะแนน: คะแนนด้านล่างที่ผลลัพธ์ถูกปฏิเสธ หากตั้งค่าเป็น 0 ระบบจะแสดงผลลัพธ์ที่มีอยู่ทั้งหมด
  • รายการที่อนุญาตของหมวดหมู่: รายการที่อนุญาตสำหรับชื่อหมวดหมู่ หากไม่ว่างเปล่า ผลลัพธ์การจัดประเภทที่หมวดหมู่ไม่อยู่ในชุดนี้จะถูกกรองออก ใช้กับรายการที่ปฏิเสธได้พร้อมกัน
  • รายการหมวดหมู่ที่ปฏิเสธ: รายการที่ปฏิเสธของชื่อหมวดหมู่ หากไม่ว่างเปล่า ผลลัพธ์การจัดประเภทที่มีหมวดหมู่ในชุดนี้จะถูกกรองออก พิเศษเฉพาะที่มาพร้อมกับรายการที่อนุญาต
    • ภาษาของชื่อที่แสดง: any string
    • ผลลัพธ์สูงสุด: any integer
    • เกณฑ์คะแนน: 0.0-1.0
    • รายการที่อนุญาตของหมวดหมู่: vector of strings
    • รายการหมวดหมู่ที่ไม่อนุญาต: vector of strings
    • ภาษาของชื่อที่แสดง: "en"
    • ผลลัพธ์สูงสุด: -1
    • เกณฑ์คะแนน: 0
    • รายการที่อนุญาตของหมวดหมู่: ว่างเปล่า
    • รายการหมวดหมู่ที่ปฏิเสธ: ว่างเปล่า
    resultListener ตั้งค่า Listener ผลลัพธ์ให้รับผลการแยกประเภทแบบไม่พร้อมกันเมื่อตัวจดจำท่าทางสัมผัสอยู่ในโหมดสตรีมแบบสด ใช้ได้เมื่อตั้งค่าโหมดการทำงานเป็น LIVE_STREAM เท่านั้น ResultListener ไม่มีข้อมูล ไม่มีข้อมูล
    errorListener ตั้งค่า Listener ข้อผิดพลาดที่ไม่บังคับ ErrorListener ไม่มีข้อมูล ไม่มีข้อมูล

    เตรียมข้อมูล

    การจดจำท่าทางสัมผัสใช้งานได้กับรูปภาพ ไฟล์วิดีโอ และวิดีโอสตรีมแบบสด งานนี้จะจัดการกับการประมวลผลอินพุตข้อมูลล่วงหน้า ซึ่งรวมถึงการปรับขนาด การหมุน และการปรับค่าให้เป็นมาตรฐาน

    โค้ดต่อไปนี้แสดงวิธีส่งต่อข้อมูลเพื่อการประมวลผล ตัวอย่างดังกล่าวจะมีรายละเอียดเกี่ยวกับวิธีจัดการข้อมูลจากรูปภาพ ไฟล์วิดีโอ และสตรีมวิดีโอสด

    รูปภาพ

    import com.google.mediapipe.framework.image.BitmapImageBuilder
    import com.google.mediapipe.framework.image.MPImage
    
    // Convert the input Bitmap object to an MPImage object to run inference
    val mpImage = BitmapImageBuilder(image).build()
        

    วิดีโอ

    import com.google.mediapipe.framework.image.BitmapImageBuilder
    import com.google.mediapipe.framework.image.MPImage
    
    val argb8888Frame =
        if (frame.config == Bitmap.Config.ARGB_8888) frame
        else frame.copy(Bitmap.Config.ARGB_8888, false)
    
    // Convert the input Bitmap object to an MPImage object to run inference
    val mpImage = BitmapImageBuilder(argb8888Frame).build()
        

    สตรีมแบบสด

    import com.google.mediapipe.framework.image.BitmapImageBuilder
    import com.google.mediapipe.framework.image.MPImage
    
    // Convert the input Bitmap object to an MPImage object to run inference
    val mpImage = BitmapImageBuilder(rotatedBitmap).build()
        

    ในโค้ดตัวอย่างการจดจำท่าทางสัมผัส ระบบจะจัดการการเตรียมข้อมูลในไฟล์ GestureRecognizerHelper.kt

    เรียกใช้งาน

    การจดจำท่าทางสัมผัสใช้ฟังก์ชัน recognize, recognizeForVideo และ recognizeAsync เพื่อเรียกใช้การอนุมาน สำหรับการจดจำท่าทางสัมผัส จะต้องประมวลผลข้อมูลอินพุตล่วงหน้า การตรวจจับมือในรูปภาพ การตรวจจับจุดสังเกต มือ และการจดจำท่าทางมือจากจุดสังเกต

    โค้ดต่อไปนี้แสดงวิธีเรียกใช้การประมวลผลด้วยโมเดลงาน ตัวอย่างเหล่านี้มีรายละเอียดเกี่ยวกับวิธีจัดการข้อมูลจากรูปภาพ ไฟล์วิดีโอ และสตรีมวิดีโอสด

    รูปภาพ

    val result = gestureRecognizer?.recognize(mpImage)
        

    วิดีโอ

    val timestampMs = i * inferenceIntervalMs
    
    gestureRecognizer?.recognizeForVideo(mpImage, timestampMs)
        ?.let { recognizerResult ->
            resultList.add(recognizerResult)
        }
        

    สตรีมแบบสด

    val mpImage = BitmapImageBuilder(rotatedBitmap).build()
    val frameTime = SystemClock.uptimeMillis()
    
    gestureRecognizer?.recognizeAsync(mpImage, frameTime)
        

    โปรดทราบดังต่อไปนี้

    • เมื่อทำงานในโหมดวิดีโอหรือโหมดสตรีมแบบสด คุณต้องระบุการประทับเวลาของเฟรมอินพุตในงานการจดจำท่าทางสัมผัสด้วย
    • เมื่อเรียกใช้ในรูปภาพหรือวิดีโอ งานการจดจำท่าทางสัมผัสจะบล็อกชุดข้อความปัจจุบันจนกว่าการประมวลผลรูปภาพหรือเฟรมอินพุตจะเสร็จสิ้น เพื่อหลีกเลี่ยงการบล็อกอินเทอร์เฟซผู้ใช้ ให้เรียกใช้การประมวลผลในชุดข้อความในเบื้องหลัง
    • เมื่อทำงานในโหมดสตรีมแบบสด งานการจดจำท่าทางสัมผัสจะไม่บล็อกเทรดปัจจุบัน แต่จะแสดงผลทันที โปรแกรมจะเรียกใช้ Listener ผลลัพธ์พร้อมผลลัพธ์การจดจำทุกครั้งที่ประมวลผลเฟรมอินพุตเสร็จ หากมีการเรียกฟังก์ชันการจดจำเมื่องานโปรแกรมจดจำท่าทางสัมผัสไม่ว่างขณะประมวลผลอีกเฟรมหนึ่ง งานนั้นจะไม่สนใจเฟรมใหม่ที่ป้อน

    ในโค้ดตัวอย่างการจดจำท่าทางสัมผัสมีการกำหนดฟังก์ชัน recognize, recognizeForVideo และ recognizeAsync ไว้ในไฟล์ GestureRecognizerHelper.kt

    แฮนเดิลและแสดงผลลัพธ์

    การจดจำท่าทางสัมผัสจะสร้างวัตถุผลลัพธ์การตรวจจับท่าทางสัมผัสสำหรับการเรียกใช้การจดจำท่าทางสัมผัสแต่ละครั้ง วัตถุผลลัพธ์มีจุดสังเกตของมือในพิกัดรูปภาพ จุดสังเกตของมือในพิกัดโลก ความถนัด(ซ้าย/ขวา) และหมวดหมู่ลักษณะมือของมือที่ตรวจพบ

    ตัวอย่างต่อไปนี้แสดงตัวอย่างข้อมูลเอาต์พุตจากงานนี้

    ผลลัพธ์ GestureRecognizerResult มีคอมโพเนนต์ 4 รายการ และแต่ละคอมโพเนนต์คืออาร์เรย์ โดยที่แต่ละองค์ประกอบแสดงผลลัพธ์ที่ตรวจพบจากมือที่ตรวจพบเพียงมือเดียว

    • ความถนัดของมือ

      ความถนัดของมือแสดงให้เห็นว่ามือที่ตรวจพบเป็นมือซ้ายหรือมือขวา

    • ท่าทางสัมผัส

      หมวดหมู่ท่าทางสัมผัสที่รู้จักของมือที่ตรวจพบ

    • จุดสังเกต

      มีจุดสังเกต 21 จุด แต่ละจุดประกอบด้วยพิกัด x, y และ z ระบบจะปรับพิกัด x และ y ให้เป็นมาตรฐานเป็น [0.0, 1.0] ตามความกว้างและความสูงของรูปภาพตามลำดับ พิกัด z แสดงถึงความลึกของจุดสังเกต โดยความลึกที่ข้อมือเป็นต้นทาง ค่ายิ่งน้อยเท่าไหร่ จุดสังเกตก็จะใกล้เคียงกับกล้องมากขึ้น ขนาดของ z ใช้สเกลใกล้เคียงกับ x

    • สถานที่สำคัญของโลก

      นอกจากนี้ยังมีจุดสังเกต 21 จุดในพิกัดของโลกด้วย จุดสังเกตแต่ละรายการประกอบด้วย x, y และ z ซึ่งแสดงพิกัด 3 มิติในชีวิตจริงในหน่วยเมตรที่มีจุดเริ่มต้นอยู่ที่จุดศูนย์กลางเรขาคณิตของมือ

    GestureRecognizerResult:
      Handedness:
        Categories #0:
          index        : 0
          score        : 0.98396
          categoryName : Left
      Gestures:
        Categories #0:
          score        : 0.76893
          categoryName : Thumb_Up
      Landmarks:
        Landmark #0:
          x            : 0.638852
          y            : 0.671197
          z            : -3.41E-7
        Landmark #1:
          x            : 0.634599
          y            : 0.536441
          z            : -0.06984
        ... (21 landmarks for a hand)
      WorldLandmarks:
        Landmark #0:
          x            : 0.067485
          y            : 0.031084
          z            : 0.055223
        Landmark #1:
          x            : 0.063209
          y            : -0.00382
          z            : 0.020920
        ... (21 world landmarks for a hand)
    

    รูปภาพต่อไปนี้แสดงภาพเอาต์พุตของงาน

    ในโค้ดตัวอย่างการจดจำท่าทางสัมผัส คลาส GestureRecognizerResultsAdapter ในไฟล์ GestureRecognizerResultsAdapter.kt จะจัดการผลลัพธ์