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