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


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

หากเราต้องการทราบว่าวัตถุนี้หรือวัตถุนั้นมีการเลื่อนไปมากน้อยเพียงใดเมื่อเทียบกับตำแหน่งในเฟรมก่อนหน้าในช่วงเวลาที่ผ่านไประหว่างเฟรมที่ยึด อันดับแรก เป็นไปได้มากว่าเราจะจำเกี่ยวกับการไหลของแสงได้ ในการค้นหาการไหลของแสง คุณสามารถใช้การใช้งานอัลกอริธึมสำเร็จรูป ทดสอบ และปรับให้เหมาะสมได้อย่างปลอดภัย เช่น จากไลบรารี OpenCV อย่างไรก็ตาม ในขณะเดียวกัน การเข้าใจทฤษฎีนี้ก็ไม่เป็นอันตรายอย่างยิ่ง ดังนั้นฉันจึงขอเชิญชวนทุกคนที่สนใจลองดูวิธีการหนึ่งที่ได้รับความนิยมและมีการศึกษาดีวิธีหนึ่ง ไม่มีรหัสในบทความนี้และ คำแนะนำการปฏิบัติแต่มีสูตรและอนุพันธ์ทางคณิตศาสตร์จำนวนหนึ่ง

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

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

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

ในภาษาคณิตศาสตร์ สมมติฐานนี้สามารถเขียนได้ดังนี้: โดยที่ I เป็นฟังก์ชันของความสว่างพิกเซลจากตำแหน่งบนเฟรมและเวลา กล่าวอีกนัยหนึ่ง x และ y คือพิกัดพิกเซลในระนาบเฟรม และเป็นออฟเซ็ต และ t คือหมายเลขเฟรมในลำดับ ตกลงกันว่าช่วงเวลาหนึ่งผ่านไประหว่างสองเฟรมที่อยู่ติดกัน

กรณีมิติเดียว
ก่อนอื่น เรามาพิจารณากรณีมิติเดียวกัน ลองนึกภาพเฟรมหนึ่งมิติสองเฟรมสูง 1 พิกเซลและกว้าง 20 พิกเซล (ภาพด้านขวา) ในเฟรมที่สอง ภาพจะเลื่อนไปทางขวาเล็กน้อย การกระจัดนี่แหละที่เราต้องการหา เมื่อต้องการทำเช่นนี้ ลองจินตนาการถึงเฟรมเดียวกันเหล่านี้เป็นฟังก์ชัน (รูปด้านซ้าย) อินพุตคือตำแหน่งพิกเซล เอาต์พุตคือความเข้มของมัน ในการเป็นตัวแทนนี้ การกระจัดที่ต้องการ (d) จะมองเห็นได้ชัดเจนยิ่งขึ้น ตามสมมติฐานของเรา นี่เป็นเพียงการเลื่อน นั่นคือเราสามารถพูดได้ว่า .

โปรดทราบว่าหากต้องการ คุณสามารถเขียนเข้ามาได้เช่นกัน มุมมองทั่วไป- โดยที่ y และ t คงที่และเท่ากับศูนย์

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

เรามาตั้งสมมติฐานที่สำคัญประการที่สองกัน: ให้เราสมมติว่ามันประมาณค่าด้วยอนุพันธ์อันดับหนึ่งได้ดีเพียงพอ- เมื่อตั้งสมมติฐานนี้แล้ว เราจะทิ้งทุกอย่างหลังจากอนุพันธ์อันดับหนึ่ง:

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

เราเกือบจะถึงที่นั่นแล้ว การกระจัด d คือค่าที่เราต้องการ ดังนั้นเราจึงต้องทำอะไรสักอย่างด้วย ตามที่เราตกลงกันไว้ก่อนหน้านี้ ดังนั้นเราจะเขียนใหม่:

กรณีสองมิติ
ตอนนี้เรามาดูจากเคสมิติเดียวไปเป็นเคสสองมิติกัน ให้เราเขียนส่วนขยายในซีรีส์ Taylor และทิ้งอนุพันธ์ที่สูงกว่าทั้งหมดทันที แทนที่จะเป็นอนุพันธ์อันดับหนึ่ง การไล่ระดับสีจะปรากฏขึ้น:

เวกเตอร์การกระจัดอยู่ที่ไหน
ตามสมมติฐานที่ตั้งไว้ โปรดทราบว่านิพจน์นี้เทียบเท่ากับ นี่คือสิ่งที่เราต้องการ มาเขียนใหม่:

เนื่องจากช่วงเวลาหนึ่งหน่วยผ่านไประหว่างสองเฟรม เราจึงสามารถพูดได้ว่าไม่มีอะไรมากไปกว่าอนุพันธ์ที่เกี่ยวข้องกับเวลา
มาเขียนใหม่:

มาเขียนใหม่อีกครั้งโดยขยายการไล่ระดับสี:

เรามีสมการที่บอกเราว่าผลรวมของอนุพันธ์ย่อยต้องเท่ากับศูนย์ ปัญหาเดียวคือเรามีสมการเดียว แต่มีสองสิ่งที่ไม่ทราบอยู่ในนั้น: และ เมื่อมาถึงจุดนี้ การบินสุดจินตนาการและแนวทางที่หลากหลายได้เริ่มต้นขึ้น

เรามาตั้งสมมติฐานข้อที่สามกัน: สมมติว่าพิกเซลข้างเคียงถูกเลื่อนไปในระยะห่างเท่ากัน- ลองใช้ส่วนของภาพขนาด 5 คูณ 5 พิกเซลแล้วตกลงว่าแต่ละพิกเซลจาก 25 พิกเซลจะเท่ากัน แทนที่จะได้สมการเดียว เราจะได้ 25 สมการในคราวเดียว! เห็นได้ชัดว่าในกรณีทั่วไป ระบบไม่มีวิธีแก้ปัญหา ดังนั้นเราจะมองหาวิธีแก้ปัญหาดังกล่าวและลดข้อผิดพลาดให้เหลือน้อยที่สุด:

โดยที่ g คือฟังก์ชันที่กำหนดค่าสัมประสิทธิ์การถ่วงน้ำหนักสำหรับพิกเซล ตัวเลือกที่พบบ่อยที่สุดคือ Gaussian สองมิติ ซึ่งให้น้ำหนักมากที่สุดกับพิกเซลส่วนกลาง และน้อยลงเรื่อยๆ เมื่อเคลื่อนออกจากศูนย์กลาง

ในการค้นหาค่าต่ำสุด เราใช้วิธีกำลังสองน้อยที่สุดและค้นหาอนุพันธ์ย่อยที่เกี่ยวข้องกับและ:

มาเขียนมันใหม่ในรูปแบบที่กะทัดรัดกว่านี้แล้วเท่ากับศูนย์:

ลองเขียนสมการทั้งสองนี้ใหม่ในรูปแบบเมทริกซ์:

หากเมทริกซ์ M กลับด้านได้ (มีอันดับ 2) เราสามารถคำนวณ และ ซึ่งจะลดข้อผิดพลาด E ให้เหลือน้อยที่สุด:

นั่นคือทั้งหมดที่ เรารู้การกระจัดของพิกเซลโดยประมาณระหว่างสองเฟรมที่อยู่ติดกัน

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

ข้อเสียของวิธีการ
วิธีการที่อธิบายไว้ข้างต้นตั้งอยู่บนสมมติฐานที่สำคัญ 3 ข้อ ซึ่งในอีกด้านหนึ่ง ทำให้เรามีโอกาสพื้นฐานในการพิจารณาการไหลของแสง แต่ในทางกลับกัน กลับทำให้เกิดข้อผิดพลาด ข่าวดีสำหรับผู้ชอบความสมบูรณ์แบบก็คือ เราจำเป็นต้องมีสมมติฐานเพียงข้อเดียวเพื่อทำให้วิธีการนี้ง่ายขึ้น และเราสามารถจัดการกับผลที่ตามมาได้ เราสันนิษฐานว่าเพื่อประมาณค่าการกระจัด อนุพันธ์อันดับ 1 น่าจะเพียงพอสำหรับเรา ในกรณีทั่วไปจะไม่เป็นเช่นนั้นอย่างแน่นอน (รูปด้านซ้าย) เพื่อให้บรรลุความแม่นยำที่ต้องการ สามารถคำนวณออฟเซ็ตสำหรับคู่เฟรมแต่ละคู่ (เรียกว่า และ ) ซ้ำได้ ในวรรณคดีสิ่งนี้เรียกว่าการแปรปรวน ในทางปฏิบัติ หมายความว่า เมื่อคำนวณการกระจัดในการวนซ้ำครั้งแรก เราจะย้ายแต่ละพิกเซลของเฟรมไปในทิศทางตรงกันข้ามเพื่อชดเชยการกระจัดนี้ ในการวนซ้ำครั้งต่อไป เราจะใช้เวอร์ชันที่บิดเบี้ยวแทนเฟรมดั้งเดิม และต่อๆ ไป จนกระทั่งถึงการวนซ้ำครั้งถัดไป การกระจัดที่เกิดขึ้นทั้งหมดจะน้อยกว่าค่าเกณฑ์ที่ระบุ เราได้ค่าการกระจัดสุดท้ายสำหรับแต่ละพิกเซลโดยเป็นผลรวมของการกระจัดในการวนซ้ำทั้งหมด

โดยธรรมชาติ วิธีนี้เป็นแบบท้องถิ่น นั่นคือเมื่อพิจารณาออฟเซ็ตของพิกเซลใดพิกเซลหนึ่ง จะพิจารณาเฉพาะพื้นที่รอบพิกเซลนี้เท่านั้น - พื้นที่ใกล้เคียงในท้องถิ่น ด้วยเหตุนี้ จึงเป็นไปไม่ได้ที่จะระบุการกระจัดภายในพื้นที่ที่มีสีสม่ำเสมอขนาดใหญ่เพียงพอ (ใหญ่กว่าขนาดของพื้นที่ใกล้เคียง) โชคดีที่พื้นที่ดังกล่าวมักไม่พบในเฟรมจริง แต่คุณลักษณะนี้ยังคงให้ค่าเบี่ยงเบนเพิ่มเติมจากออฟเซ็ตจริง

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

บทสรุป
เราได้จัดเรียงมันออก รากฐานทางทฤษฎีหนึ่งในวิธีการหาค่าการไหลเชิงแสง มีวิธีการที่น่าสนใจอื่นๆ อีกมากมาย ซึ่งบางวิธีในปัจจุบันให้ผลลัพธ์ที่น่าเชื่อถือมากกว่า อย่างไรก็ตาม วิธีลูคัส-คานาเดะ แม้จะค่อนข้างมีประสิทธิภาพ แต่ก็ยังเข้าใจได้ง่าย ดังนั้นจึงเหมาะอย่างยิ่งสำหรับการแนะนำพื้นฐานทางคณิตศาสตร์

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

ในบันทึกที่เสแสร้งนี้ ฉันขอสรุปและไปยังแหล่งที่มาและลิงก์ที่มีประโยชน์
วิธีลูคัส-คานาเดะ เพิ่มแท็ก

การไหลของแสงเป็นเทคโนโลยีที่ใช้ในคอมพิวเตอร์วิทัศน์ในด้านต่างๆ เพื่อกำหนดการเลื่อน การแบ่งส่วน การเลือกวัตถุ และการบีบอัดวิดีโอ อย่างไรก็ตาม หากเราต้องการนำไปใช้อย่างรวดเร็วในโครงการของเรา โดยได้อ่านเกี่ยวกับมันใน Wikipedia หรือที่อื่น แล้วเป็นไปได้มากว่าเราจะสะดุดอย่างรวดเร็วกับความจริงที่ว่ามันทำงานได้ไม่ดีมากและล้มเหลวเมื่อพิจารณาการเปลี่ยนแปลงของลำดับของ 1-2 พิกเซล (อย่างน้อยก็เป็นเช่นนั้นสำหรับฉัน) ถ้าอย่างนั้นเรามาดูกันดีกว่า การใช้งานที่พร้อมทำเช่นใน OpenCV มีการใช้งานโดยใช้วิธีการต่าง ๆ และไม่มีความชัดเจนเลยว่าทำไมตัวย่อ PyrLK ถึงดีกว่าหรือแย่กว่าการกำหนด Farneback หรืออะไรทำนองนั้นและคุณจะต้องเข้าใจความหมายของพารามิเตอร์ซึ่งมีอยู่มากมายในบางส่วน การใช้งาน ยิ่งไปกว่านั้น สิ่งที่น่าสนใจก็คืออัลกอริธึมเหล่านี้ใช้งานได้ ไม่เหมือนที่เราเขียนเอง ความลับคืออะไร?

การไหลของแสงคืออะไร

การไหลของแสง (OP) คือภาพของการเคลื่อนไหวที่ชัดเจนซึ่งแสดงถึงการเคลื่อนตัวของแต่ละจุดระหว่างสองภาพ โดยพื้นฐานแล้วมันแสดงถึงสนามความเร็ว (เนื่องจากการเปลี่ยนแปลงจนถึงขนาดจะเทียบเท่ากับความเร็วชั่วขณะ) สาระสำคัญของ OP คือในแต่ละจุดในภาพจะพบการเปลี่ยนแปลง (dx, dy) เพื่อให้จุดบนภาพที่สองสอดคล้องกับจุดเดิม วิธีพิจารณาความสอดคล้องของคะแนนเป็นคำถามแยกต่างหาก ในการทำเช่นนี้ คุณจะต้องใช้ฟังก์ชันจุดบางประเภทที่ไม่เปลี่ยนแปลงอันเป็นผลมาจากการกระจัด โดยปกติจะถือว่าจุดหนึ่งยังคงความเข้มของมันไว้ (เช่น ความสว่างหรือสีสำหรับภาพสี) แต่จุดที่รักษาขนาดของการไล่ระดับสี, Hessian, ขนาดหรือปัจจัยกำหนดของมัน, Laplacian และคุณลักษณะอื่นๆ ถือว่าเหมือนกัน . แน่นอนว่าการรักษาความเข้มจะล้มเหลวหากการส่องสว่างหรือมุมตกกระทบของแสงเปลี่ยนไป อย่างไรก็ตาม หากเรากำลังพูดถึงสตรีมวิดีโอ เป็นไปได้มากว่าแสงจะไม่เปลี่ยนแปลงมากนักระหว่างสองเฟรม หากเพียงเพราะช่วงเวลาสั้น ๆ ผ่านไประหว่างเฟรมเหล่านั้น ดังนั้นความเข้มจึงมักถูกใช้เป็นฟังก์ชันที่ถูกสงวนไว้ที่จุดหนึ่ง

จากคำอธิบายนี้ เราสามารถสร้างความสับสนให้กับ OP กับการค้นหาและการเปรียบเทียบจุดคุณลักษณะได้ แต่สิ่งเหล่านี้ต่างออกไป สาระสำคัญของการไหลของแสงก็คือ มันไม่ได้มองหาจุดพิเศษใด ๆ แต่พยายามพิจารณาว่าจุดใดเปลี่ยนไปตามพารามิเตอร์ของภาพ

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

สำหรับกรณีที่เสื่อมลง สามารถใช้วิธีที่ง่ายกว่าในการพิจารณาการเปลี่ยนแปลงได้ โดยเฉพาะอย่างยิ่ง หากจุดภาพทั้งหมดมีการเลื่อนเท่ากัน (ภาพทั้งหมดถูกเลื่อน) ก็สามารถใช้วิธีความสัมพันธ์ของเฟสได้: คำนวณการแปลงฟูริเยร์สำหรับทั้งสองภาพ ค้นหาการบิดเบี้ยวของระยะของภาพเหล่านั้น แล้วใช้เพื่อกำหนดการเปลี่ยนแปลง ( ดูที่ en.wikipedia.org /wiki/Phase_correlation) คุณยังสามารถใช้การจับคู่แบบบล็อก: ค้นหาการเปลี่ยนแปลงที่ลดบรรทัดฐานของความแตกต่างระหว่างรูปภาพในหน้าต่างให้เหลือน้อยที่สุด ใน รูปแบบบริสุทธิ์อัลกอริธึมดังกล่าวจะทำงานเป็นเวลานานและไม่เสถียรต่อการหมุนและการบิดเบือนอื่นๆ วิกิพีเดียภาษาอังกฤษจัดประเภทอัลกอริธึมที่ระบุไว้เป็นตัวเลือกต่าง ๆ สำหรับการคำนวณการไหลของแสง แต่ดูเหมือนว่าจะไม่ถูกต้องสำหรับฉันเนื่องจากอัลกอริธึมเหล่านี้สามารถใช้เพื่อวัตถุประสงค์อื่นและไม่สามารถแก้ไขได้ทั้งหมด งานนี้- เราจะเรียกวิธีการตามลักษณะเฉพาะของการไหลของแสงของภาพ (สิ่งที่เรียกว่าวิธีการเชิงอนุพันธ์ในวิกิพีเดียภาษาอังกฤษ)

วิธีมาตรฐาน (วิธีลูคัส-คานาเดะ)

คำอธิบายทางคณิตศาสตร์ของอัลกอริทึมมีรายละเอียดเพียงพอในบทความนี้ แต่จะกล่าวถึงเฉพาะแง่มุมทางทฤษฎีเท่านั้น

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

อนุญาต – ความเข้ม ณ จุดใดจุดหนึ่ง (x, y) ในภาพแรก (เช่น ที่เวลา t) ในภาพที่สอง จุดนี้เคลื่อนที่ไป (dx, dy) ในขณะที่เวลา dt ผ่านไป จากนั้นเราให้ Taylor ขยายฟังก์ชันความเข้มไปที่เทอมแรก (ต่อมาจะกล่าวถึงว่าทำไมถึงเทอมแรกเท่านั้น) นี่คือ อนุพันธ์บางส่วนเกี่ยวกับพิกัดและเวลา นั่นคือโดยพื้นฐานแล้วคือการเปลี่ยนแปลงความสว่างที่จุด (x, y) ระหว่างสองเฟรม

เราเชื่อว่าจุดนั้นยังคงความเข้มข้นอยู่ ซึ่งหมายถึง
เราได้สมการหนึ่งที่มีค่าไม่ทราบสองตัว (dx และ dy) ซึ่งหมายความว่าการแก้โจทย์นั้นไม่เพียงพอ กล่าวคือ สมการนี้เพียงอย่างเดียวจะใช้ได้ไม่ไกล

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

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

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

ที่นี่คณิตศาสตร์กำหนดเรา เธอปลูกฝังให้เรารู้สึกว่าการทำงานทั้งหมดรอบตัวเรามีความต่อเนื่องและหลายครั้งสามารถแยกแยะได้ โดยทั่วไป ที่สถาบันนี้ เราถูกสอนให้เขียนการประมาณฟังก์ชันในบริเวณใกล้จุดหนึ่งโดยใช้สูตรเทย์เลอร์ และเราใช้มันอย่างไร้เหตุผลและสนุกสนานในทุกที่ ทีนี้ลองคิดถึงความหมายทางกายภาพของอนุพันธ์ใน สถานที่แห่งนี้- เราต้องการใช้มันเพื่อกำหนดการเปลี่ยนแปลงค่าของฟังก์ชันในย่านที่มีขอบเขตจำกัดของจุด และอนุพันธ์จะให้แนวคิดเกี่ยวกับย่านใกล้เคียงที่เล็กที่สุด หากต้องการขยายพื้นที่ใกล้เคียงนี้ อาจเป็นไปได้ที่จะเพิ่มลำดับอนุพันธ์ที่สูงขึ้นให้กับส่วนขยายของ Taylor แต่จะนำไปสู่ความไม่เชิงเส้นในระบบ ซึ่งจะทำให้แก้ไขได้ยากขึ้นมาก และข้อดีจะเป็นที่น่าสงสัย โดยเฉพาะอย่างยิ่งเมื่อ ในทางปฏิบัติเราไม่ได้เกี่ยวข้องกับฟังก์ชันที่สามารถหาอนุพันธ์ได้หลายตัวอย่างต่อเนื่อง แต่โดยทั่วไปแล้วไม่ชัดเจนว่าฟังก์ชันที่ไม่ต่อเนื่องคืออะไร ดังนั้นจึงมีเหตุผลมากกว่าที่จะมองหาฟังก์ชัน g(x) ซึ่งในกรณีที่แยกกันของเรา f(x) + g(x) = f(x+1), f(x) + 2g(x) = f(x) จะให้ค่าที่แม่นยำที่สุดเท่าที่จะเป็นไปได้คือ +2), f(x) - g(x) = f(x-1) เป็นต้น ดังนั้น ในกรณีนี้ เราไม่ต้องการอนุพันธ์ แต่ต้องมีฟังก์ชันเชิงเส้นบางตัวที่ อยู่ใกล้กับจุดของฟังก์ชันเดิมมากที่สุด การคำนวณทางคณิตศาสตร์อย่างง่ายนำไปสู่การแก้ปัญหา , ที่ไหน - หากเราสร้างอนุพันธ์โดยใช้จุดใกล้เคียงจุดหนึ่งในแต่ละด้าน เราก็โชคดี ในกรณีนี้ สูตรเกิดขึ้นพร้อมกับสูตรในการคำนวณอนุพันธ์โดยประมาณ: g(x) = (f(x+1) – f(x- 1)) / 2 โดยทั่วไปใน OpenCV เมื่อคำนวณการไหลของแสงของ Lucas-Kanade จะใช้สูตรนี้อย่างแน่นอน เราจะกลับมาที่สิ่งนี้ในภายหลัง แต่ถ้าคุณได้คะแนนมากขึ้น สูตรจะแตกต่างอย่างสิ้นเชิงจากแผนผลต่างแบบคลาสสิกสำหรับอนุพันธ์อันดับ 1

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

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

อย่างไรก็ตาม มาตรการเหล่านี้ไม่ได้ช่วยเราจากการจำกัดการเปลี่ยนแปลงที่ตรวจพบไว้ที่ 2-3 พิกเซลด้วย อย่างไรก็ตาม ใน OpenCV 1.0 มีการนำการไหลของแสงมาใช้และทำงานได้ภายใต้สภาวะที่เหมาะสมและในกะที่น้อยมากเท่านั้น

จะทำอย่างไร?
โดยสรุป ลูคัส-คานาเดะตามปกติสามารถระบุการเปลี่ยนแปลงเล็กๆ น้อยๆ ได้ดี โดยที่รูปภาพจะคล้ายกับการประมาณเชิงเส้น เพื่อต่อสู้กับสิ่งนี้ เราจะใช้เทคนิค CV มาตรฐาน – แบบหลายสเกล: เราจะสร้าง “ปิรามิด” ของรูปภาพที่มีขนาดต่างกัน (เกือบทุกครั้งจะปรับขนาด 2 เท่าในแต่ละแกน ซึ่งง่ายกว่าในการคำนวณ) และดำเนินการผ่านพวกมัน ด้วยการไหลของแสงจากภาพที่เล็กกว่าไปยังภาพที่ใหญ่กว่า ดังนั้นการเปลี่ยนแปลงเล็กน้อยที่ตรวจพบก็คือ ภาพขนาดเล็กจะสอดคล้องกับการเปลี่ยนแปลงขนาดใหญ่ในภาพขนาดใหญ่ ในภาพที่เล็กที่สุด เราตรวจพบการเปลี่ยนแปลงไม่เกิน 1-2 พิกเซล และเมื่อย้ายจากขนาดที่เล็กลงไปสู่ขนาดที่ใหญ่ขึ้น เราใช้ผลลัพธ์จากขั้นตอนก่อนหน้าและปรับแต่งค่าการเปลี่ยนแปลง ที่จริงแล้วใน OpenCV นั้นถูกใช้งานโดยฟังก์ชัน calcOptFlowPyrLK การใช้อัลกอริธึมปิระมิดนี้ทำให้เราไม่ต้องกังวลกับการคำนวณการประมาณเชิงเส้นของหลายจุด: ง่ายกว่าที่จะหาระดับของปิรามิดให้มากขึ้น และในแต่ละระดับจะใช้การประมาณค่าฟังก์ชันนี้ค่อนข้างคร่าวๆ ดังนั้น OpenCV จึงคำนวณโดยใช้จุดใกล้เคียงเพียงสองจุดเท่านั้น ดังนั้นในส่วนที่เกี่ยวข้องกับการนำอัลกอริธึมไปใช้ข้อสรุปของเราเกี่ยวกับข้อได้เปรียบของฟังก์ชันการประมาณเหนืออนุพันธ์จึงไร้ประโยชน์: สำหรับจุดอ้างอิงจำนวนดังกล่าว อนุพันธ์คือฟังก์ชันการประมาณที่ดีที่สุด

มีอันไหนอีกบ้างคะ?

อัลกอริธึมนี้ไม่ใช่ตัวเลือกเดียวสำหรับการคำนวณการไหลของแสง ใน OpenCV นอกเหนือจากโฟลว์ของ Lucas-Kanade แล้ว ยังมีโฟลว์ Farneback และ SimpleFlow และอัลกอริทึม Horn–Shunck ก็มักถูกอ้างถึงเช่นกัน

วิธี ฮอร์น-ชุงค์มีลักษณะเป็นสากลมากกว่าวิธีลูคัส-คานาเดะ ขึ้นอยู่กับสมมติฐานที่ว่าการไหลของแสงจะค่อนข้างราบรื่นทั่วทั้งภาพ จากสมการเดียวกันนี้ ขอเสนอให้ย้ายไปยังฟังก์ชัน นั่นคือ เพื่อเพิ่มข้อกำหนดว่าไม่มีการเปลี่ยนแปลงอย่างกะทันหันในการเปลี่ยนแปลงด้วยค่าสัมประสิทธิ์การถ่วงน้ำหนัก α การลดฟังก์ชันนี้ลงทำให้เรามีระบบสมการสองสมการ:

ในสมการเหล่านี้ เสนอให้คำนวณ Laplacian โดยประมาณ: – ผลต่างกับค่าเฉลี่ย เราได้ระบบสมการที่เราเขียนสำหรับแต่ละพิกเซลและแก้โจทย์ ระบบทั่วไปซ้ำ:

ในอัลกอริธึมนี้ พวกเขายังแนะนำให้ใช้หลายสเกล และแนะนำให้ปรับขนาดรูปภาพไม่ 2 เท่า แต่คูณ 0.65

อัลกอริทึมนี้ถูกนำมาใช้ใน OpenCV เวอร์ชันแรก แต่ถูกละทิ้งในภายหลัง

ฟาร์เนแบ็คเสนอให้ประมาณการเปลี่ยนแปลงความเข้มในบริเวณใกล้เคียงโดยใช้รูปแบบกำลังสอง: I = xAx + bx + c ด้วยเมทริกซ์สมมาตร A (อันที่จริง เมื่อพิจารณาการขยายตัวของเทย์เลอร์จนถึงเทอมแรก เราจึงใช้การประมาณเชิงเส้น I = bx + c นั่นคือตอนนี้เราเพิ่งตัดสินใจเพิ่มความแม่นยำของการประมาณ) หากภาพเคลื่อนที่ภายในย่านนี้ เราก็แทนที่ส่วนขยายกำลังสอง เปิดวงเล็บ เราจะได้


.

ตอนนี้เราสามารถคำนวณค่าของ A, b, c ในรูปภาพทั้งสองได้ จากนั้นระบบนี้จะซ้ำซ้อนเมื่อเทียบกับ d (สมการแรกทำให้เกิดความสับสนเป็นพิเศษ) และโดยทั่วไป d สามารถหาได้จากสมการที่สอง: - เราต้องใช้การประมาณดังต่อไปนี้: - ให้เราแสดงถึงความเรียบง่ายด้วย แล้วเราจะได้เพียง .

เพื่อชดเชยเสียงรบกวนระหว่างการคำนวณ เรากลับไปสู่สมมติฐานอีกครั้งว่าในบริเวณใกล้เคียงกับจุดที่กำลังศึกษา ทุกจุดจะมีการเปลี่ยนแปลงที่เหมือนกันไม่มากก็น้อย ดังนั้นเราจึงรวมข้อผิดพลาดบนหน้าต่างเข้ากับค่าสัมประสิทธิ์การถ่วงน้ำหนักแบบเกาส์เซียนอีกครั้ง และค้นหาเวกเตอร์ d ที่ลดความคลาดเคลื่อนทั้งหมดนี้ให้เหลือน้อยที่สุด จากนั้นเราจะได้รับค่าที่เหมาะสมที่สุดและข้อผิดพลาดขั้นต่ำที่สอดคล้องกัน นั่นคือ เราจำเป็นต้องคำนวณแต่ละจุด เฉลี่ยเหนือหน้าต่าง กลับด้านเมทริกซ์ และรับผลลัพธ์ ดังนั้นผลิตภัณฑ์เหล่านี้สามารถคำนวณได้สำหรับทั้งภาพและสามารถใช้ค่าที่คำนวณไว้ล่วงหน้าสำหรับจุดต่าง ๆ ได้นั่นคือนี่เป็นกรณีที่สมเหตุสมผลในการคำนวณการไหลที่หนาแน่น

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

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

อัลกอริธึมที่เคร่งครัดยิ่งขึ้นมีลักษณะดังนี้: สำหรับทุกจุดในหน้าต่างจะมีฟังก์ชัน "พลังงาน" ที่รับผิดชอบ (โดยมีการพึ่งพาลอการิทึมผกผัน) สำหรับความน่าจะเป็นที่จุดเริ่มต้นจะเปลี่ยนไปยังจุดนี้: . ถัดไปจะพิจารณาการบิดของพลังงานนี้ด้วยหน้าต่างเกาส์เซียนและพบค่า (dx,dy) ที่ย่อฟังก์ชันนี้ให้เหลือน้อยที่สุด เพื่อให้ได้ความแม่นยำของพิกเซลย่อย จะมีการพิจารณาพื้นที่ใกล้เคียงเล็กๆ ของจุดที่เหมาะสมที่สุดที่พบ (dx,dy) และหาจุดสูงสุดของฟังก์ชันพลังงานซึ่งเป็นจุดสูงสุดของพาราโบลาลอยด์ และดังที่ได้กล่าวไปแล้ว ขั้นตอนนี้ดำเนินการกับปิรามิดของภาพที่ปรับขนาดแล้ว อัลกอริธึมของพวกเขายังเสนอวิธีการที่ชาญฉลาดในการเร่งการคำนวณ แต่ผู้ที่สนใจจะคิดออกเอง สิ่งที่สำคัญสำหรับเราก็คือด้วยเหตุนี้ อัลกอริทึมนี้(ตามทฤษฎี) เร็วพอและมีความแม่นยำดี และไม่มีปัญหาเช่นเดียวกับครั้งก่อน ๆ ยิ่งมีการเปลี่ยนแปลงมากเท่าไรก็ยิ่งตรวจพบได้แย่ลงเท่านั้น

จะเป็นอย่างไรถ้าเราไม่จริงจัง?

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

ฝึกฝน

เรามาลองใช้อัลกอริธึมที่ OpenCV เสนอให้เราในทางปฏิบัติ

ที่นี่คุณสามารถดำเนินการศึกษาที่แตกต่างกันมากมายเกี่ยวกับแต่ละอัลกอริธึม พารามิเตอร์ที่แตกต่างกัน การเปลี่ยนแปลงลำดับอินพุต - ด้วยการเปลี่ยนแปลง การหมุน การแปลงโปรเจ็กต์ที่แตกต่างกัน ส่วนต่างๆ ที่มีสัญญาณรบกวนที่แตกต่างกัน ฯลฯ การดำเนินการทั้งหมดนี้ใช้เวลานานและขนาดของรายงานจะ เกินกว่าบทความนี้ ดังนั้น ในที่นี้ ฉันขอเสนอให้จำกัดตัวเองอยู่เพียงกรณีง่ายๆ ของภาพคู่ขนานที่ขยับตามระยะทางคงที่และการวางสัญญาณรบกวนเล็กน้อย ซึ่งจะทำให้สามารถเข้าใจได้ โครงร่างทั่วไป, วิธีรันอัลกอริธึมและอันไหนที่เจ๋งกว่า

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

Lucas-Kanade แบบคลาสสิกถูกนำมาใช้กับปิรามิดในขั้นตอน calcOpticalFlowPyrLK อัลกอริธึมจะคำนวณการไหลแบบกระจาย นั่นคือ สำหรับชุดของจุดที่กำหนดในภาพแรก มันจะประมาณตำแหน่งของพวกเขาในภาพที่สอง พารามิเตอร์อินพุตค่อนข้างชัดเจน: รูปภาพอินพุตสองรูป, ชุดอินพุตและเอาต์พุตของจุด, สถานะ - เวกเตอร์เอาต์พุตที่ระบุว่าพบจุดที่เกี่ยวข้องสำเร็จหรือไม่, ผิดพลาด - เวกเตอร์เอาต์พุตของข้อผิดพลาดโดยประมาณของจุดที่เกี่ยวข้อง, WinSize - ขนาดของหน้าต่างที่เกิดค่าเฉลี่ยแบบเกาส์ ฉันเอา 21x21 และทำงานได้ดี maxLevel – จำนวนเลเยอร์ในปิรามิดลบหนึ่ง นั่นคือจำนวนของเลเยอร์สุดท้าย ฉันเอา 5 เกณฑ์ – เงื่อนไขสำหรับการออก กระบวนการวนซ้ำในการพิจารณาการเปลี่ยนแปลง (การลดข้อผิดพลาดให้น้อยที่สุดทำซ้ำ) – ฉันปล่อยให้พารามิเตอร์นี้เป็นค่าเริ่มต้น แฟล็ก – แฟล็กเพิ่มเติม ตัวอย่างเช่น คุณสามารถใช้การประมาณโฟลว์เริ่มต้นหรือเลือกวิธีการประมาณค่าข้อผิดพลาด minEigThreshold – เกณฑ์การไล่ระดับสี ค่าด้านล่างซึ่งเมทริกซ์ถือเป็นเอกพจน์ ฉันปล่อยไว้ตามค่าเริ่มต้น ตั้งแต่ OpenCV 2.4.1 สามารถใช้พีระมิดที่คำนวณไว้ล่วงหน้าของรูปภาพที่ปรับขนาดแล้วในการคำนวณโฟลว์ได้

ผลลัพธ์ของงานคือตรวจจับทั้งกะเล็กและใหญ่ได้สำเร็จและเสถียร ทนทานต่อเสียงรบกวนที่ค่อนข้างใหญ่ เวลาทำงานประมาณ 10 ms สำหรับ 400 จุดด้วยปิรามิด 5 ชั้น (บนคอร์ i7 950)

อย่างไรก็ตาม อัลกอริธึมนี้ยังใช้กับ GPU (CUDA) ทั้งเวอร์ชันหนาแน่นและเบาบาง

โฟลว์ Farneback ถูกนำมาใช้โดยขั้นตอน calcOpticalFlowFarneback ซึ่งโฟลว์หนาแน่นจะถูกคำนวณ นั่นคือ การเปลี่ยนแปลงของแต่ละจุด พารามิเตอร์: รูปภาพอินพุต, สตรีมเอาต์พุตในรูปแบบของเมทริกซ์ลอยสองช่องสัญญาณ, pyr_scale กำหนดอัตราส่วนขนาดระหว่างชั้นของปิรามิด, ระดับ – จำนวนระดับในปิรามิด, ขนาด Winsize – ขนาดของหน้าต่างที่มีค่าเฉลี่ย ดำเนินการ, การวนซ้ำ – จำนวนการวนซ้ำในแต่ละระดับ, poly_n – ขนาดของพหุนามที่ใช้ประมาณค่าของ A และ b, poly_sigma – ซิกม่าของ Gaussian blur เมื่อปรับอนุพันธ์ให้เรียบ ค่าพารามิเตอร์ที่แนะนำ มีการระบุไว้ในคู่มือ แฟล็ก – แฟล็กเพิ่มเติม ตัวอย่างเช่น คุณสามารถใช้การประมาณเบื้องต้นของการไหลหรือค่าเฉลี่ยเหนือหน้าต่าง

อัลกอริธึมนี้มีความเสถียรน้อยกว่ามาก (ตามการสังเกตของฉัน) มันพลาดได้ง่ายกว่าในรูปภาพที่ค่อนข้างสม่ำเสมอ (เห็นได้ชัดว่าปัญหาคือการไม่มีการกรองจุดที่ไม่สำเร็จ) และตรวจไม่พบการเปลี่ยนแปลงขนาดใหญ่ได้ดี มันใช้งานได้สำหรับฉันใน 600 มิลลิวินาทีบนรูปภาพขนาด 512x512

โฟลว์ SimpleFlow ใช้ขั้นตอน calcOpticalFlowSF (อีกครั้ง โฟลว์หนาแน่นจะถูกคำนวณ) และมีพารามิเตอร์ลึกลับมากมายที่ไม่มีค่าเริ่มต้น และโดยทั่วไป ในขณะนี้ ข้อมูลบนเพจได้รับการจัดเตรียมไว้อย่างกระชับมาก ลองคิดดูสิ 3 ภาพแรกเป็นภาพอินพุตและเอาต์พุตสองช่องสัญญาณ เลเยอร์ – จำนวนเลเยอร์ในปิรามิด ซึ่งก็คือจำนวนครั้งที่เราปรับขนาดภาพต้นฉบับ averaging_block_size - ขนาดของหน้าต่างที่เราคำนวณฟังก์ชันพลังงานพิกเซล max_flow - การเปลี่ยนแปลงสูงสุดที่เราต้องการกำหนดในแต่ละขั้นตอน โดยพื้นฐานแล้วจะถูกกำหนดโดยขนาดหน้าต่าง (แม้ว่าจะยังไม่ชัดเจนว่าทำไมจึงเป็น int) คุณสามารถหยุดที่นี่หรือจะตั้งค่าพารามิเตอร์เพิ่มเติมอีกสองสามอย่างก็ได้ ซึ่งความหมายของบางส่วนก็หายไปจากฉัน

ไซต์นำเสนอตัวอย่างการใช้งานซึ่งมีการเปิดใช้งานด้วยพารามิเตอร์ต่อไปนี้: calcOpticalFlowSF(frame1, frame2, flow, 3, 2, 4, 4.1, 25.5, 18, 55.0, 25.5, 0.35, 18, 55.0, 25.5 , 10) ;

อัลกอริทึมของฉันทำงานช้ากว่าคนอื่นๆ มาก ประมาณ 9-12 วินาทีต่อรูปภาพขนาด 512x512 ผลลัพธ์ของงานดูเป็นไปได้มากกว่า Farneback อย่างน้อยที่สุดการเปลี่ยนแปลงของภาพที่สม่ำเสมอก็ถูกกำหนดได้ดีกว่า และทำงานได้ดีขึ้นอย่างเห็นได้ชัดกับการเปลี่ยนแปลงขนาดใหญ่

ข้อสรุป

หากคุณต้องการใช้ออปติคอลโฟลว์ที่ไหนสักแห่ง ก่อนอื่นให้พิจารณาว่าคุณต้องการมันหรือไม่ เนื่องจากคุณมักจะผ่านมันไปได้มากกว่านั้น วิธีการง่ายๆ- การดำเนินการปรับใช้โฟลว์ด้วยตัวเองนั้นคุ้มค่าที่จะคิดไม่กี่ครั้ง: แต่ละอัลกอริธึมมีลูกเล่น รายละเอียดปลีกย่อย และการเพิ่มประสิทธิภาพมากมาย ไม่ว่าคุณจะทำอะไรก็ตาม มันคงจะทำงานได้ดีกว่าใน OpenCV (สมมติว่ามันอยู่ที่นั่นแน่นอน) ยิ่งไปกว่านั้น พวกเขาใช้ประโยชน์จากการปรับแต่งลอจิคัลและฮาร์ดแวร์อย่างเต็มที่ เช่น การใช้คำสั่ง SSE, มัลติเธรด, ความสามารถในการคำนวณด้วย CUDA หรือ OpenCL เป็นต้น หากคุณเพียงแค่ต้องคำนวณการเปลี่ยนแปลงของชุดจุดบางจุด (เช่น สตรีมแบบกระจาย) คุณก็ สามารถใช้ฟังก์ชัน calcOpticalFlowPyrLK ได้อย่างปลอดภัย ทำงานได้ดี เชื่อถือได้ และค่อนข้างเร็ว ในการคำนวณการไหลหนาแน่น ควรใช้ฟังก์ชัน calcOpticalFlowSF แต่จะช้ามาก หากประสิทธิภาพเป็นสิ่งสำคัญ ให้ calcOpticalFlowFarneback แต่คุณยังต้องตรวจสอบให้แน่ใจว่าผลลัพธ์ของงานจะเหมาะกับคุณ

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

การประมาณการไหลของแสง

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

ในกรณีของมิติ 2D+ ที(กรณีที่มีขนาดสูงกว่าจะคล้ายกัน) พิกเซลที่ตำแหน่งที่มีความเข้มในเฟรมเดียวจะถูกย้ายไปยัง และสามารถเขียนสมการต่อไปนี้ได้

สมมติว่าการกระจัดมีขนาดเล็กและใช้อนุกรม Taylor เราจะได้:

จากความเท่าเทียมกันเหล่านี้มีดังนี้:

จากที่นี่ปรากฎว่า

ส่วนประกอบความเร็วการไหลของแสงใน

ได้ภาพมาในทิศทางที่สอดคล้องกัน

ดังนั้น:

สมการที่ได้มีสองสิ่งที่ไม่ทราบค่าและไม่สามารถแก้ไขได้ สิ่งนี้เรียกว่าปัญหารูรับแสง ปัญหาได้รับการแก้ไขโดยการกำหนดข้อ จำกัด เพิ่มเติม - การทำให้เป็นมาตรฐาน

วิธีการพิจารณาการไหลของแสง:

    ความสัมพันธ์ของเฟสคือการผกผันของสเปกตรัมข้ามที่ทำให้เป็นมาตรฐาน

    วิธีการบล็อก - ลดผลรวมของกำลังสองหรือผลรวมของโมดูลัสของความแตกต่าง

    วิธีการเชิงอนุพันธ์สำหรับการประมาณค่าการไหลของแสงโดยอิงจากอนุพันธ์ย่อยของสัญญาณ:

    อัลกอริธึมของลูคัส - คานาเดะ - พิจารณาบางส่วนของภาพและแบบจำลองการเคลื่อนไหว

    Horn–Shunck - การลดฟังก์ชันที่อธิบายการเบี่ยงเบนจากการสันนิษฐานของความสว่างคงที่และความราบรื่นของสนามเวกเตอร์ที่เกิดขึ้น

    Buxton–Buxton - ขึ้นอยู่กับแบบจำลองการเคลื่อนที่ของขอบเขตวัตถุในลำดับภาพ

    วิธีการแปรผันทั่วไปคือการดัดแปลงวิธี Horn-Schunck ที่ใช้ข้อจำกัดด้านข้อมูลที่แตกต่างกันและข้อจำกัดด้านความเรียบที่แตกต่างกัน

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

การติดตามการไหลของแสงมักใช้กับกล้องแบบคงที่ เช่น กล้องในสนามบินหรืออาคาร หรือกล้องติดรถยนต์

ในงานนี้มีการใช้วิธีการโดยใช้อัลกอริธึม Lucas-Kanade (รูปที่ 4-6)

ข้าว. 4 หน้าต่างหลักของโมเดล



ข้าว. 5 บล็อกโมเดล

ข้าว. 6 ผลลัพธ์ของแบบจำลอง

โมเดลนี้ใช้วิธีการประมาณค่าการไหลของแสงเพื่อกำหนดเวกเตอร์การเคลื่อนไหวในแต่ละเฟรมของไฟล์วิดีโอ ด้วยการจำกัดและประมาณเวกเตอร์การเคลื่อนไหวตามสัณฐานวิทยา โมเดลจะสร้างภาพลักษณะไบนารี โมเดลจะค้นหารถยนต์ในแต่ละอิมเมจไบนารี่ผ่านบล็อก "Blob Analysis" จากนั้นบล็อก Draw Shapes จะวาดรูปสี่เหลี่ยมสีเขียวรอบๆ รถยนต์ที่ผ่านเส้นสีขาว

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

Agafonov V.Y. 1

1 Agafonov Vladislav Yuryevich - นักศึกษาระดับบัณฑิตศึกษาของภาควิชา "การออกแบบโดยใช้คอมพิวเตอร์ช่วยและระบบการออกแบบการค้นหา", มหาวิทยาลัยเทคนิคแห่งรัฐโวลโกกราด,

โวลโกกราด

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

คำสำคัญ: การประมวลผลภาพ การค้นหาการแทนที่รูปภาพ

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

Agafonov V.U. 1

1 Agafonov Vladislav Urevich - นักศึกษาระดับบัณฑิตศึกษาของแผนก "ระบบการออกแบบโดยใช้คอมพิวเตอร์ช่วยและการออกแบบการค้นหา"

มหาวิทยาลัยเทคนิคแห่งรัฐโวลโกกราด, โวลโกกราด

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

คำสำคัญ: การประมวลผลภาพ การประมาณค่าการเปลี่ยนภาพ

ยูดีซี 004.932.2

การแนะนำ

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

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

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

ในงานนี้จะมีการพิจารณาสองวิธี วิธีหนึ่งช่วยให้คุณได้รับการชดเชยสำหรับจุดสำคัญแต่ละจุด และวิธีที่สอง - สำหรับแต่ละพิกเซล

การไหลของแสงโดยวิธีลูคัส-คานาเดะ

แนวคิดพื้นฐานของวิธีนี้คือการถือว่าค่าพิกเซลย้ายจากเฟรมหนึ่งไปยังเฟรมถัดไปโดยไม่มีการเปลี่ยนแปลง:

ที่ไหน. โดยไม่สนใจเทอมที่เหลือเราจะได้สูตรสำหรับการประมาณ ????:

โดยจะกำหนดออฟเซ็ต ตามสมมติฐานที่เราทำไว้เราได้รับสิ่งนั้น จากนั้นเราเขียนสมการ (4) เป็น

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

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

การเท่ากันค่าสัมประสิทธิ์ที่สอดคล้องกันของพหุนามกำลังสองที่เรามี:

สิ่งนี้เป็นจริงสำหรับสัญญาณใดๆ

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

ให้เราแทนที่การแทนค่าพหุนามสากลด้วยค่าท้องถิ่น มาคำนวณค่าสัมประสิทธิ์พหุนามสำหรับรูปภาพแรกและรูปภาพที่สองกัน ตาม (9) ควรจะเป็นเช่นนั้น แต่ในทางปฏิบัติจะใช้การประมาณ:

โดยที่สะท้อนถึงการแทนที่การกระจัดทั่วโลกด้วยการกระจัดที่แตกต่างกันในเชิงพื้นที่

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

ปัญหาหลักของวิธีนี้คือการสันนิษฐานว่าพหุนามเหมือนกัน ยกเว้นออฟเซ็ต เนื่องจากการขยายพหุนามเฉพาะที่ของพหุนามจะเปลี่ยนไปตามสภาพแวดล้อม สิ่งนี้จะทำให้เกิดข้อผิดพลาดใน (11) สำหรับการกระจัดเล็ก ๆ สิ่งนี้ไม่สำคัญ แต่เมื่อการกระจัดเพิ่มขึ้น ข้อผิดพลาดก็จะเพิ่มขึ้น หากเรามีความรู้นิรนัยเกี่ยวกับอคติ เราสามารถเปรียบเทียบพหุนามสองตัวได้: อันแรกใน, อันที่สองใน โดยที่นี่คืออคติก่อนหน้า โดยปัดเศษเป็นค่าจำนวนเต็ม ด้วยวิธีนี้เราสามารถดำเนินการวิธีการซ้ำได้ อคติก่อนหน้าที่ดีกว่าหมายถึงอคติที่ค่อนข้างเล็ก ซึ่งจะเพิ่มโอกาสในการประมาณค่าอคติที่แท้จริงได้ดียิ่งขึ้น

การประยุกต์วิธีการไหลของแสงกับปัญหาการค้นหาการกระจัดของภาพ

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

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

สำหรับวิธี Farneback ก็เพียงพอที่จะเฉลี่ยค่าการกระจัดในแต่ละพิกเซลแล้ว

การทดลองดำเนินการกับตัวอย่างคู่ทดสอบ 20 คู่ และคำนวณค่าเบี่ยงเบนมาตรฐานสำหรับแต่ละวิธี

OP ลูคัส-แคนาดา

โอพี ฟาร์เนบาก้า

ตารางที่ 1 - ค่าเบี่ยงเบนมาตรฐานของการกระจัด

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

แต่ละวิธีมีข้อดีและข้อเสีย รวมถึงขอบเขตและข้อจำกัดในตัวเอง วิธีลูคัส-คานาเดะใช้การไหลของแสงแบบกระจัดกระจายและ

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

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

บทสรุป

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

อ้างอิง/ อ้างอิง

  1. Fleet D., Weiss Y. การประมาณค่าการไหลด้วยแสง // คู่มือแบบจำลองทางคณิตศาสตร์ในคอมพิวเตอร์วิทัศน์ - Springer US, 2006. - หน้า 237-257.
  2. Farnebäck G. การประมาณค่าการเคลื่อนที่แบบสองเฟรมโดยอาศัยการขยายพหุนาม // การวิเคราะห์รูปภาพ - พ.ศ. 2546. - หน้า 363-370.



สูงสุด