Friday, April 16, 2010

Learning OpenCV: Template Matching



วิธีนี้ไม่ใช้ histogram แต่ใช้วิธีการ match patch ที่มีรูปภาพ (ในกรณีของ back project patch นั้นจะเป็นแค่กรอบ ภาพนั้นใช้ภาพจากภาพ test) การ match patch ของรูปภาพ กับ ภาพที่จะหานั้นจะใช้วิธีที่จะกล่าวถึงต่อไปในตอนนี้

ก่อนอื่นมาดูฟังก์ชันในการ match template กันก่อน

void cvMatchTemplate(
    const CvArr* image,
    const CvArr* templ,
    CvArr* result,
    int method
);

image คือภาพที่จะหา template
templ คือ template ที่จะหาในภาพ
result คือผลลัพธ์
method คือวิธีในการคำนวณการ matching มีดังนี้

  • Square difference matching method (method = CV_TM_SQDIFF)(หาค่าผลต่างกำลังสอง)
  • Correlation matching methods (method = CV_TM_CCORR)(หา correlation)
  • Correlation coefficient matching methods (method = CV_TM_CCOEFF)

ยังมี normalized version ของสามวิธีนี้ ซึ่งจะช่วยลดผลการผิดพลาดเนื่องจากสภาพแสงไม่เท่ากัน (ในตัวอย่าง histogram matching EMD) คือ

  • CV_TM_SQDIFF_NORMED
  • CV_TM_CCORR_NORMED
  • CV_TM_CCOEFF_NORMED


วิธี CV_TM_SQDIFF จะใช้เวลาน้อยสุดแต่ผลที่ได้จะค่อนข้างแย่ตรงช้ามกับ CV_TM_CCORR_NORMED แต่ก็ต้อง trade-off

เช่นเดียวกับ cvCalcBackProjectPatch เราจะหาตำแหน่งของ วัตถุได้โดยใช้คำสั่ง cvMinMaxLoc (แต่ต้องระวังหน่อยเพราะว่า mothod ที่ต่างกันค่าที่ต้องการก็จะต่างกันเช่น CV_TM_SQDIFF_NORMED ต้องหาค่า min ส่วน CV_TM_CCORR_NORMED หรือ CV_TM_CCOEFF_NORMED ต้องหาค่า max)

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

1 comment:

  1. ชอบวิธีการอธิบายมากเลยครับ เข้าใจง่ายดี

    แต่ผมขอท้วงอย่างนึง ตรงที่บอกว่าให้ใช้ smooth filter ปกติแล้ว filter พวกนี้ทำให้ peak ที่โดดขึ้นมา (เช่น noise) มีค่าลดลง ฉะนั้นประสิทธิภาพของการหาจุด best match น่าจะต่ำลงนะครับ

    ReplyDelete