วันพุธที่ 19 กันยายน พ.ศ. 2561

ปัญหาและวิธีแก้ไขเรื่องกล้องไม่โฟกัส

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

    ในบทความจะเป็นการสร้าง Script ให้กับ ARCamera ขึ้นมาซึ่งตัวโค้ดเองนั้นได้มีการใช้คำสั่งทำให้ตัวของอุปกรณ์นั้นทำการ Auto Focus เองแบบอัตโนมัติ โดยใช้ Focus Mode แบบ"ต่อเนื่อง" หรือ แบบ Continuous 

ตัวอย่างโค้ดการเลือกโหมด


CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);


นอกจากโหมด continuous แล้วยังมีอีกหลายโหมดด้วยกันตามบทความนี้ Link
ซึ่งผมก็ยังไม่ค่อยเข้าใจในโหมดต่างๆมากนัก และคิดว่าโหมด Continuous เองก็สามารถที่
จะใช้งานได้ดีอยู่แล้วเพราะฉะนั้นผมจึงขอข้ามเนื้อหาในส่วนนี้ไปครับ
























ผลเปรียบเทียบระหว่างแอปพลิเคชัน


รูปจากแอปพลิเคชันที่ไม่ได้ใส่ Script Auto Focus




รูปจากแอปพลิเคชันที่ใส่ Script Auto Focus แล้ว


วันอังคารที่ 18 กันยายน พ.ศ. 2561

การทดลองทำปุ่มไว้บนป้ายแบบ AR

    การทดลองนี้เกิดขึ้นจากที่ว่า ในวันพฤหัสบดีที่ 13 กันยายน พศ. 2561 เพื่อนที่ทำโปรเจคท์นี้ด้วยกันได้พูดขึ้นมาว่า เราน่าจะลองทำเป็นปุ่มกดบนป้ายนะ เพราะว่าตัวป้ายนั้นมีตั้งแต่ชั้นที่ 1 - 6 ถ้าเราทำปุ่มกดบนป้ายให้ ผู้ใช้กดได้เลยคงจะสะดวกไม่น้อยเลยทีเดียว

    ตัวผมเองก็มีความสนใจและเห็นด้วยกับความคิดนี้เลยลองค้นหาวิธีการสร้างปุ่มและสามารถใช้กับ AR ได้ ซึ่งก็มีอยู่หลายวิธีซึ่งวิธีที่ผมสนใจคือวิธีที่อยู่ในคลิปวิดิโอนี้ครับ Link (Youtube) ซึ่งผมก็ลองทำตามดูแล้วมันก็ได้ผลตามวิดิโอด้านล่าง


    โดยในวิดิโอจะเป็นการอัดหน้าจอจากโทรศัพท์ของผมแล้วสแกน Target ที่อยู่บนหน้าจอโน๊ตบุ๊คของผมเองครับ

    ในคลิปวิดิโอนั้นจะเป็นการกดปุ่มทั้งหมด 6 ปุ่ม โดยเมื่อกดแล้วจะมีเสียงเป็น โด เร มี ฟา ซอล ลา ไล่มาตั้งแต่ปุ่มบนสุดถึงปุ่มล่างสุดครับ

สิ่งที่ได้จากการทดลอง

1. การประยุกต์ใช้ 3D Model Cube มาทำเป็นปุ่มกดด้วยการใช้ Switch-Case 



    จากรูปด้านบนจะเห็นได้ว่าปุ่มกดที่ใช้กดนั้นผมใช้เป็น 3D Model ลูกบาศ์กธรรมดามาใช้เป็นปุ่มกดครับ โดยในไฟล์ Script จะมีชุดคำสั่งดังนี้อยู่

Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);

    คำสั่งด้านบนจะเป็นการรับอินพุทว่าตอนนี้หน้าจอของอุปกรณ์ที่เป็น Touch Screen นั้นถูกสัมผัสที่จุดใด แล้วเมื่อเรารู้ว่าจุดใดถูกกดอยู่ เราสามารถที่จะเรียกค่า value ที่เป็น name ของ object ที่เรากำลังกดอยู่ได้ แล้วนำไปเข้า switch case แล้วทำตามเงื่อนไขต่างๆได้ครับ ในที่นี้จะเป็นเงื่อนไขการเล่นเสียงโน๊ตต่างๆ


รูปภาพการใช้เงื่อนไข Switch Case


รูปภาพการตั้งชื่อให้ 3D Model Cube เป็น btn1-btn6

2. การสร้าง Array เปล่าใน Unity Script


รูปการสร้าง Array aClips และการใช้ Library AudioSource สำหรับการเล่นเสียงเพลง


การเรียกใช้ Array และใช้คำสั่งเล่นเสียงเพลง


    ในไฟล์ Script ผมจำเป็นจะต้องสร้าง Array ขึ้นมาชื่อว่า aClips ไว้สำหรับการเล่นเสียงตัวโน๊ตที่ต่างกัน ซึ่งพอผมสร้างเสร็จแล้วในโปรแกรม Unity จะมีแถบใหม่ขึ้นมาเป็นแถบชื่อ aClips ตามชื่อ Array ที่ผมได้สร้างเอาไว้ และผมสามารถที่จะลากไฟล์เสียงเข้าไปเป็น Element ของ Array เพื่อไว้ใช้เล่นเป็นเสียงได้เลยครับ


รูปภาพการเพิ่ม element ให้กับ Array



การทดลองใช้ป้ายตึกเป็น Target


    ในบริเวณอาคาร 81 จะมีเป็นป้ายบอกรายละเอียดว่าตัวอาคารนั้นแต่ละชั้นมีอะไรบ้าง ซึ่งท่านอาจารย์ที่ปรึกษาให้ลองไปนำป้ายพวกนี้มาเป็น Target ซึ่งเราก็ได้เลือกมา 2 ป้ายจาก 2 สถานที่ นั้นคือ


1. ชั้น 1 อาคาร 81

   

2. ชั้นที่ 2 อาคาร 81 



    ซึ่งดูจากรูปแล้วทั้งสองป้ายนั้นมีรายละเอียดเหมือนกันแต่ผมจำเป็นที่จะต้องนำมา 2 ป้ายเพราะว่า ในส่วนของป้ายชั้นที่ 1 นั้นอยู่ในกรอบพลาสติกใส ซึ่งอาจจะทำให้เกิดการสะท้อนแสงอาจจะทำให้เกิดการ Tracking เกิดผิดพลาดได้ ต่างจากป้ายที่สองซึ่งถูกแปะไว้กับตัวประตูเลย

ผลการวัด Rating

1. รูปป้ายที่ชั้น 1 ได้ 2 ดาว




2. รูปป้ายชั้นที่ 2 ได้ 1 ดาว



สรุปผลการทดลอง

    จากการทดลองนำไปใช้เป็น Target ผลปรากฏว่ารูปทั้ง 2 สามารถนำไปใช้เป็น Target ได้ถึงแม้ว่ารูปที่มาจากป้ายที่อยู่ชั้น 1 นั้นจะมีภาพสะท้อนของหลอดไฟและถูกนับเป็นจุด Tracking ไปด้วย



รูปการใช้ป้ายของชั้นที่ 1 เป็น Target


รูปการใช้ป้ายของชั้นที่ 2 เป็น Target





วันจันทร์ที่ 10 กันยายน พ.ศ. 2561

Vuforia + Unity Tutorial Part 4 : Ideal Target

ผลการค้นหารูปภาพสำหรับ target





    Target นั้นเป็นส่วนสำคัญในการใช้ AR แบบ Marker เพราะจะเป็นส่วนที่ตัวอุปกรณ์นั้นจะสแกนแล้วแสดงผลลัพธ์ออกมา โดย Target ที่เป็นแบบ Single Image นั้นจะต้องมีความชัดเจนพอที่จะทำให้ตัวอุปกรณ์นั้นสามารถที่จะสแกนได้ โดย Vuforia ได้กำหนดลักษณะของตัว Target ที่เป็นอุดมคติไว้ดังนี้

แหล่งที่มา https://library.vuforia.com/articles/Solution/Optimizing-Target-Detection-and-Tracking-Stability

    1. Rich in detail => มีรายละเอียดของรูปภาพเยอะ เช่น ภาพผู้คนบนท้องถนน กลุ่มคนหรือสิ่งของจำนวนมากๆ หรือ อาจจะเป็นรูปภาพการแข่งขันกีฬา เป็นต้น



ตัวอย่าง Target ที่ดี

    2. Good contrast => รูปภาพนั้นมีแสงสว่างมากเพียงพอ ไม่มืดหรือสว่างมากจนเกินไป

รูปภาพที่เกี่ยวข้อง

ตัวอย่างของ Target ที่ไม่ดี เนื่องจากมีสีที่มืดจนเกินไป


    3. No repetitive pattern => รูปภาพจะต้องไม่มีลักษณะเป็นรูปแบบซ้ำๆกัน เช่น รูปตารางหมากรุก

ผลการค้นหารูปภาพสำหรับ checker boards

ตัวอย่างของ Target ที่ไม่ดีเพราะเป็นรูปแบบซ้ำกันทั้งรูป

วันอังคารที่ 4 กันยายน พ.ศ. 2561

Vuforia + Unity Tutorial Part 3 : ทดลองการแสดงผลแบบใช้ Marker



    ในโพสต์นี้นะครับจะเป็นการทดลองเกี่ยวกับ AR โดยใช้ Unity + Vuforia เช่นเคย โดยในโพสต์นี้จะเป็นทดลองใช้ AR แบบ Marker อย่างง่ายนะครับ

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

สิ่งที่ได้เรียนรู้

    1) การใช้ Target Manager ในตอนแรกที่ผมได้สัมผัสใช้งาน Vuforia เป็นเรื่องปกติที่เวลาสร้างโปรเจคท์ใหม่ผมก็จะต้องมาขอ License Key อันใหม่ ซึ่งมันจะมี Tab ข้างๆ ที่เขียนว่า Target Manager ซึ่งในตอนนั้นเองผมก็สงสัยว่ามันคืออะไร แต่จากชื่อมันก็น่าจะเกี่ยวกับตัวของ Target หรือ Marker นั้นเอง 


    จากรูปด้านล่าง เมื่อเราทำการสร้าง Database เสร็จนะครับ เราจะสามารถ Add รูปที่ใช้เป็น Target/Marker ได้ โดยจากคลิปวิดิโอจะให้ใช้สองรูปด้านล่างครับ

    เมื่อเรา Add เสร็จแล้วเราสามารถกดโหลด Database นี้เพื่อไปใช้งานต่อได้โดยสามารถเลือก Platform ที่เราใช้ได้ 2 ประเภทนั้นคือ Android Studio, Xcode , Visual Studio จะอยู่หมวดเดียวกัน กับอีกประเภทคือจะใช้กับ Unity นั้นเองครับ


    2) Import ทุกอย่างที่ต้องใช้ ในที่นี้จะต้องใช้ Database ที่เราได้โหลดมา แล้วก็ตัวของรูป Model 3D ที่จะให้มันแสดงผลออกมา และในคลิปจะมีการ Import Package ของ Vuforia ด้วยซึ่งคลิปมันก็ลงไว้เมื่อ 2017 ซึ่งตอนนี้ที่ผมลองทำปี 2018 ตอน Install โปรแกรม Unity นั้นจะมีการติ๊กให้ลง Vuforia ไปเลย ทำให้ในส่วนนี้นั้นผมไม่จำเป็นที่จะต้อง Import เข้ามาเหมือนกับเขาครับ (ในข้อนี้ผมจะขอไม่ใส่รูปนะครับ)

    3) เมื่อทำการ Import Package ต่างๆเสร็จแล้วนะครับเราก็จะต้องใช้ตัว Object ต่างๆตามรูปด้านล่างนะครับ



3.1 ARCamera อยู่ใน Package ของ Vuforia ครับเพื่อให้เราใช้งานแทนตัวของ Main Camera ซึ่งจะต้องมีการใส่ License Key ด้วยครับ

3.2 ImageTarget จะเป็นตัวที่เราเลือกใส่รูป Target ลงไปครับจะมีหน้าตาประมาณรูปข้างล่าง โดยตัวรูปที่เราเลือกจะมาจากที่เราได้ใส่ไว้ใน Database ในเว็บ Vuforia และดาวน์โหลดมาเป็น Package ครับผม


รูปตอนเลือกตัวรูปที่จะใช้เป็น Target


เมื่อเลือกเสร็จะเป็นรูปดังนี้

3.2 wolf อันนี้จะเป็นรูป Model 3D ที่เราจะใช้ครับซึ่งผมเลือกที่จะใช้เป็นรูปหมาป่า โดยจากรูปด้านบนเราจะต้องเลือกให้เป็น Child ของ Object ที่ชื่อว่า ImageTarget นะครับไม่อย่างนั้นแล้วจะไม่สามารถทำงานได้ ตัวโมเดลหมาป่าจะโผล่ขึ้นมาเลยเวลาใช้งาน 


    หลังจากทำตามขั้นตอนที่กำหนดนะครับเราก็สามารถที่จะ Build APK ออกมารันในโทรศัพท์ได้เลยครับก็ถือว่าเสร็จแล้ว หรือเราจะลองกดรันใน Unity แล้วลองหาภาพ Target มาลองดูก่อนว่าหมาป่าจะขึ้นหรือไม่ตามภาพด้านล่างครับ

    จากรูปจะเห็นได้ว่าผมเอาโทรศัพท์ของผมเปิดตัวรูป Target แล้วลองส่งดูก็จะขึ้นเป็นรูปของหมาป่าครับ


    อีกรูปหนึ่งจะเป็นรูปที่ผม Capture มาจากจอโทรศัพท์ของผมครับโดยใช้โน๊ตบุ๊คผมเปิดรูป Target แล้วส่องไปที่จอดูครับ ก็จะขึ้นเป็นหมาป่าเด้งออกมา

    สาเหตุที่ผมจะต้องมาศึกษาการใช้ Marker นะครับเพราะว่าเราอาจจะจำเป็นที่จะต้องใช้ตัว Marker เนี่ย ในการระบุตำแหน่งชั้นของผู้ใช้งานครับว่าตอนนี้เขานั้นอยู่ที่จุดไหน ชั้นอะไรครับผม เลยจำเป็นที่จะต้องศึกษาไว้ก่อน