การวิเคราะห์รูปภาพ
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 เฟรมต่อวินาที) โหมดการทำงานทั้งสองจะให้ประสบการณ์โดยรวมที่ราบรื่น ประสบการณ์การใช้งาน โหมดการบล็อกยังคงมีประโยชน์ในบางสถานการณ์ เช่น เมื่อจัดการกับปัญหาระบบที่กระตุกมากๆ
โหมดการบล็อกที่มีเวลาในการตอบสนองสูงและเครื่องมือวิเคราะห์ประสิทธิภาพสูง จำเป็นต้องใช้คิวที่นานขึ้นเพื่อชดเชยเวลาในการตอบสนอง อย่างไรก็ตาม โปรดทราบว่า แอปพลิเคชันยังคงประมวลผลเฟรมทั้งหมดได้
เครื่องมือวิเคราะห์ที่ใช้เวลาในการตอบสนองสูงและใช้เวลานาน (นักวิเคราะห์ประมวลผลทั้งหมดไม่ได้ เฟรม) ในโหมดไม่บล็อกอาจ เป็นตัวเลือกที่เหมาะสมกว่า เนื่องจากต้องทิ้งเฟรมสำหรับเส้นทางการวิเคราะห์ กรณีใช้งานที่เกิดขึ้นพร้อมกันอื่นๆ จะยังเห็นเฟรมทั้งหมด
การใช้งาน
หากต้องการใช้การวิเคราะห์รูปภาพในแอปพลิเคชันของคุณ ให้ทำตามขั้นตอนต่อไปนี้
- สร้าง
ImageAnalysis
Use Case - สร้าง
ImageAnalysis.Analyzer
- ตั้งค่าเครื่องมือวิเคราะห์เป็น
ImageAnalysis
- เชื่อมโยง
เจ้าของวงจร ตัวเลือกกล้อง และกรณีการใช้งาน
ImageAnalysis
ไปจนถึงวงจรการใช้งาน
CameraX จะส่งอิมเมจไปยังเครื่องมือวิเคราะห์ที่ลงทะเบียนไว้ทันทีหลังเชื่อมโยง
หลังจากวิเคราะห์เสร็จแล้ว ให้โทร
ImageAnalysis.clearAnalyzer()
หรือยกเลิกการเชื่อมโยง Use Case ImageAnalysis
เพื่อหยุดการวิเคราะห์
กรณีการใช้งานของการสร้าง ImageAnalysis
เชื่อมต่อ ImageAnalysis
แล้ว
เครื่องมือวิเคราะห์ (ผู้บริโภครูปภาพ) ไปยัง CameraX ซึ่งเป็นผู้ผลิตรูปภาพ
แอปพลิเคชันใช้ได้
ImageAnalysis.Builder
เพื่อสร้างออบเจ็กต์ ImageAnalysis
ด้วย ImageAnalysis.Builder
แอปพลิเคชันสามารถกำหนดค่าดังต่อไปนี้:
- พารามิเตอร์เอาต์พุตรูปภาพ:
- รูปแบบ: รองรับ CameraX
YUV_420_888
และRGBA_8888
จนถึงsetOutputImageFormat(int)
รูปแบบเริ่มต้นคือYUV_420_888
- ความละเอียด และ AspectRatio: คุณสามารถตั้งค่าพารามิเตอร์ตัวใดตัวหนึ่งได้ แต่โปรดทราบว่าคุณไม่สามารถตั้งค่าพารามิเตอร์ทั้ง 2 ตัวได้ ในเวลาเดียวกัน
- การหมุน
- ชื่อเป้าหมาย: ใช้พารามิเตอร์นี้สำหรับการแก้ไขข้อบกพร่อง
- รูปแบบ: รองรับ CameraX
- การควบคุมโฟลว์ของภาพ:
แอปพลิเคชันสามารถกำหนดความละเอียดหรือสัดส่วนการแสดงผลได้ แต่ไม่สามารถ
ทั้ง 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 สำหรับการกำหนดค่าพื้นที่สีและตำแหน่งที่จะดึงไบต์พิกเซลได้
ภายในเครื่องมือวิเคราะห์ แอปพลิเคชันควรทำสิ่งต่างๆ ต่อไปนี้
- วิเคราะห์เฟรมที่ระบุให้เร็วที่สุดเท่าที่จะทำได้ หากเป็นไปได้ ขีดจำกัดเวลาของอัตราเฟรมที่กำหนด (เช่น น้อยกว่า 32 มิลลิวินาทีสำหรับรูปแบบ 30 FPS) หากแอปพลิเคชันไม่สามารถวิเคราะห์เฟรมได้รวดเร็วพอ ให้พิจารณา หนึ่งใน กลไกการทิ้งเฟรมที่รองรับ
- ปล่อย
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
ตัวอย่างโค้ด