การวิเคราะห์รูปภาพ

การวิเคราะห์รูปภาพ Use Case จะทำให้แอปของคุณมีรูปภาพที่ CPU เข้าถึงได้ ซึ่งคุณสามารถใช้ ดำเนินการประมวลผลรูปภาพ คอมพิวเตอร์วิทัศน์ หรืออนุมานของแมชชีนเลิร์นนิง ในแอปพลิเคชันนำ analyze() ที่เรียกใช้ในแต่ละเฟรม

หากต้องการดูวิธีผสานรวม ML Kit ของ Google กับแอป CameraX ดูเครื่องมือวิเคราะห์ ML Kit

โหมดการทํางาน

เมื่อไปป์ไลน์การวิเคราะห์ของแอปพลิเคชันไม่ตรงตามเฟรมของ CameraX คุณสามารถกำหนดค่า CameraX ให้ข้ามเฟรมได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้

  • non-block (ค่าเริ่มต้น): ในโหมดนี้ ผู้ดำเนินการจะแคช รูปภาพล่าสุดลงในบัฟเฟอร์รูปภาพ (คล้ายกับคิวที่มีความลึก 1 รูป) ขณะที่แอปพลิเคชันวิเคราะห์รูปภาพก่อนหน้า หาก CameraX ได้รับรูปภาพใหม่ก่อนที่แอปพลิเคชันจะเสร็จสิ้น รูปภาพใหม่จะบันทึกไว้ในบัฟเฟอร์เดียวกันโดยเขียนทับรูปภาพก่อนหน้า โปรดทราบว่า ImageAnalysis.Builder.setImageQueueDepth() ไม่มีผลต่อ ในสถานการณ์นี้ และเนื้อหาบัฟเฟอร์จะถูกเขียนทับเสมอ คุณสามารถเปิดใช้โหมดที่ไม่บล็อกได้โดยโทร setBackpressureStrategy() ด้วย STRATEGY_KEEP_ONLY_LATEST ดูข้อมูลเพิ่มเติมเกี่ยวกับผลกระทบของผู้ดำเนินการได้จากข้อมูลอ้างอิง เอกสารประกอบสำหรับ STRATEGY_KEEP_ONLY_LATEST

  • การบล็อก: ในโหมดนี้ ผู้ดำเนินการภายในสามารถเพิ่มรูปภาพได้หลายรูป ลงในคิวภาพภายใน และเริ่มทิ้งเฟรมเฉพาะเมื่อคิวคือ เต็มรูปแบบ การบล็อกจะเกิดขึ้นในขอบเขตอุปกรณ์กล้องทั้งหมด หาก อุปกรณ์กล้องถ่ายรูปมีกรณีการใช้งานที่มีผลผูกพันหลายกรณี กรณีการใช้งานเหล่านั้นจะ ถูกบล็อกขณะที่ CameraX กำลังประมวลผลภาพเหล่านี้ สำหรับ ตัวอย่างเช่น เมื่อเชื่อมโยงทั้งการแสดงตัวอย่างและการวิเคราะห์รูปภาพกับอุปกรณ์กล้องถ่ายรูป การแสดงตัวอย่างจะถูกบล็อกขณะที่ CameraX กำลังประมวลผลภาพ คุณสามารถเปิดใช้โหมดบล็อกได้โดยส่ง STRATEGY_BLOCK_PRODUCER ถึง setBackpressureStrategy() นอกจากนี้คุณยังกำหนดค่าความลึกของคิวรูปภาพได้โดยใช้ ImageAnalysis.Builder.setImageQueueDepth()

มาพร้อมเวลาในการตอบสนองต่ำและเครื่องมือวิเคราะห์ประสิทธิภาพสูงที่ให้เวลารวมในการ การวิเคราะห์รูปภาพสั้นกว่าระยะเวลาของเฟรม CameraX (เช่น 16 มิลลิวินาทีสำหรับ 60 เฟรมต่อวินาที) โหมดการทำงานทั้งสองจะให้ประสบการณ์โดยรวมที่ราบรื่น ประสบการณ์การใช้งาน โหมดการบล็อกยังคงมีประโยชน์ในบางสถานการณ์ เช่น เมื่อจัดการกับปัญหาระบบที่กระตุกมากๆ

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

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

การใช้งาน

หากต้องการใช้การวิเคราะห์รูปภาพในแอปพลิเคชันของคุณ ให้ทำตามขั้นตอนต่อไปนี้

CameraX จะส่งอิมเมจไปยังเครื่องมือวิเคราะห์ที่ลงทะเบียนไว้ทันทีหลังเชื่อมโยง หลังจากวิเคราะห์เสร็จแล้ว ให้โทร ImageAnalysis.clearAnalyzer() หรือยกเลิกการเชื่อมโยง Use Case ImageAnalysis เพื่อหยุดการวิเคราะห์

กรณีการใช้งานของการสร้าง ImageAnalysis

เชื่อมต่อ ImageAnalysis แล้ว เครื่องมือวิเคราะห์ (ผู้บริโภครูปภาพ) ไปยัง CameraX ซึ่งเป็นผู้ผลิตรูปภาพ แอปพลิเคชันใช้ได้ ImageAnalysis.Builder เพื่อสร้างออบเจ็กต์ ImageAnalysis ด้วย ImageAnalysis.Builder แอปพลิเคชันสามารถกำหนดค่าดังต่อไปนี้:

แอปพลิเคชันสามารถกำหนดความละเอียดหรือสัดส่วนการแสดงผลได้ แต่ไม่สามารถ ทั้ง 2 อย่าง ความละเอียดเอาต์พุตที่แน่นอนขึ้นอยู่กับขนาดที่แอปพลิเคชันขอ (หรือสัดส่วนภาพ) และความสามารถของฮาร์ดแวร์ และอาจแตกต่างจากข้อมูลตามที่ขอ ขนาดหรืออัตราส่วน สำหรับข้อมูลเกี่ยวกับอัลกอริทึมการจับคู่ความละเอียด โปรดดู เอกสารสำหรับ setTargetResolution()

แอปพลิเคชันสามารถกำหนดค่าพิกเซลภาพเอาต์พุตให้เป็น YUV (ค่าเริ่มต้น) หรือพื้นที่สี RGBA เมื่อตั้งค่ารูปแบบเอาต์พุต RGBA ระบบจะใช้ CameraX เป็นการภายใน แปลงรูปภาพจาก YUV เป็นพื้นที่สี RGBA และรวมบิตรูปภาพลงใน ByteBuffer ของระนาบแรกของ ImageProxy (ไม่ได้ใช้ระนาบอีก 2 ลำ) ที่มี ลำดับต่อไปนี้

ImageProxy.getPlanes()[0].buffer[0]: alpha
ImageProxy.getPlanes()[0].buffer[1]: red
ImageProxy.getPlanes()[0].buffer[2]: green
ImageProxy.getPlanes()[0].buffer[3]: blue
...

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

สร้างเครื่องมือวิเคราะห์

แอปพลิเคชันสามารถสร้างเครื่องมือวิเคราะห์ได้โดยใช้ ImageAnalysis.Analyzer อินเทอร์เฟซและการลบล้าง analyze(ImageProxy image) ในโปรแกรมวิเคราะห์แต่ละรายการ แอปพลิเคชันจะได้รับ ImageProxy ซึ่งเป็น Wrapper สำหรับ Media.Image คุณจะค้นหารูปแบบรูปภาพได้ด้วย ImageProxy.getFormat() รูปแบบคือค่าใดค่าหนึ่งต่อไปนี้ที่แอปพลิเคชัน ให้พร้อมกับ ImageAnalysis.Builder:

  • ImageFormat.RGBA_8888 หากแอปขอ OUTPUT_IMAGE_FORMAT_RGBA_8888
  • ImageFormat.YUV_420_888 หากแอปขอ OUTPUT_IMAGE_FORMAT_YUV_420_888

ดูกรณีการใช้งานของการสร้าง ImageAnalysis สำหรับการกำหนดค่าพื้นที่สีและตำแหน่งที่จะดึงไบต์พิกเซลได้

ภายในเครื่องมือวิเคราะห์ แอปพลิเคชันควรทำสิ่งต่างๆ ต่อไปนี้

  1. วิเคราะห์เฟรมที่ระบุให้เร็วที่สุดเท่าที่จะทำได้ หากเป็นไปได้ ขีดจำกัดเวลาของอัตราเฟรมที่กำหนด (เช่น น้อยกว่า 32 มิลลิวินาทีสำหรับรูปแบบ 30 FPS) หากแอปพลิเคชันไม่สามารถวิเคราะห์เฟรมได้รวดเร็วพอ ให้พิจารณา หนึ่งใน กลไกการทิ้งเฟรมที่รองรับ
  2. ปล่อย ImageProxy ไปยัง CameraX โดยการโทร ImageProxy.close() โปรดทราบว่าคุณไม่ควรเรียกใช้ฟังก์ชันปิดของ Media ที่บีบอัด (Media.Image.close())

แอปพลิเคชันจะใช้ Media.Image ที่รวมไว้ภายใน ImageProxy ได้โดยตรง เพียงอย่าเรียกใช้ Media.Image.close() ในรูปภาพที่รวมไว้เนื่องจากจะทำให้ใช้งานไม่ได้ กลไกการแชร์รูปภาพภายใน CameraX ให้ใช้ ImageProxy.close() เพื่อเผยแพร่ Media.Image ที่เกี่ยวข้องไปยัง CameraX

กำหนดค่าเครื่องมือวิเคราะห์สำหรับ ImageAnalysis

เมื่อคุณสร้างเครื่องมือวิเคราะห์แล้ว ให้ใช้ ImageAnalysis.setAnalyzer() เพื่อลงทะเบียนเพื่อเริ่มการวิเคราะห์ เมื่อวิเคราะห์เสร็จแล้ว ให้ใช้ ImageAnalysis.clearAnalyzer() เพื่อนำเครื่องมือวิเคราะห์ที่ลงทะเบียนไว้ออก

กำหนดค่าเครื่องมือวิเคราะห์ที่ใช้งานอยู่ได้เพียง 1 รายการสำหรับการวิเคราะห์รูปภาพ การโทร ImageAnalysis.setAnalyzer() จะแทนที่เครื่องมือวิเคราะห์ที่ลงทะเบียนไว้ หากมี มีอยู่ แอปพลิเคชันสามารถตั้งค่าตัววิเคราะห์ใหม่ได้ทุกเมื่อ ก่อนหรือหลังการเชื่อมโยง Use Case

เชื่อมโยง ImageAnalysis กับวงจรชีวิต

ขอแนะนำอย่างยิ่งให้เชื่อมโยง ImageAnalysis กับไฟล์ที่มีอยู่ วงจรของ AndroidX ที่มี ProcessCameraProvider.bindToLifecycle() โปรดทราบว่าฟังก์ชัน bindToLifecycle() จะแสดงผล อุปกรณ์ Camera เครื่องที่ใช้ได้ เพื่อปรับแต่งการตั้งค่าขั้นสูง เช่น การรับแสง และอื่นๆ ดูข้อมูลเพิ่มเติมเกี่ยวกับการควบคุมเอาต์พุตของกล้องได้ในคู่มือนี้

ตัวอย่างต่อไปนี้รวมทุกอย่างจากขั้นตอนก่อนหน้า โดยเชื่อมโยง กรณีการใช้งานของ CameraX ImageAnalysis และ Preview สำหรับเจ้าของ lifeCycle:

Kotlin

val imageAnalysis = ImageAnalysis.Builder()
    // enable the following line if RGBA output is needed.
    // .setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
    .setTargetResolution(Size(1280, 720))
    .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
    .build()
imageAnalysis.setAnalyzer(executor, ImageAnalysis.Analyzer { imageProxy ->
    val rotationDegrees = imageProxy.imageInfo.rotationDegrees
    // insert your code here.
    ...
    // after done, release the ImageProxy object
    imageProxy.close()
})

cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, imageAnalysis, preview)

Java

ImageAnalysis imageAnalysis =
    new ImageAnalysis.Builder()
        // enable the following line if RGBA output is needed.
        //.setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
        .setTargetResolution(new Size(1280, 720))
        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
        .build();

imageAnalysis.setAnalyzer(executor, new ImageAnalysis.Analyzer() {
    @Override
    public void analyze(@NonNull ImageProxy imageProxy) {
        int rotationDegrees = imageProxy.getImageInfo().getRotationDegrees();
            // insert your code here.
            ...
            // after done, release the ImageProxy object
            imageProxy.close();
        }
    });

cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, imageAnalysis, preview);

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับ CameraX ได้ในแหล่งข้อมูลเพิ่มเติมต่อไปนี้

Codelab

  • เริ่มต้นใช้งาน CameraX
  • ตัวอย่างโค้ด

  • ตัวอย่างแอป CameraX