Saturday, April 17, 2010

Learning OpenCV: Contour Convexity and Pairwise Geometrical Histograms

ในตอนนี้จะรวมสองเรื่องที่เหลือในการ matching contour


Contour Convexity and Convexity Defects
เป็นวิธีในการหา convex hull (เปลือกที่นูน น่าจะหมายถึงเส้นรอบของ วัตถุที่ไม่มีส่วนเว้าเข้า) ของวัตถุ หลังจากนั้นคำนวณหา convexity defects เราจะนำ convexity defects เหล่านี้มาเป็นส่วนหนึั่งของ characteristic ของ complex object ได้

จากรูปมือที่่เห็น เส้นกรอปนอก(สีดำ)คือ convex hull พื้นที่ ตั้งแต่ a-h คือ convexity defects

ฟังก์ชันที่ใช้ในการคำนวณ convexity defects มีสามตัวคือ

#define CV_CLOCKWISE 1
#define CV_COUNTER_CLOCKWISE 2

CvSeq* cvConvexHull2(
    const CvArr* input,
    void* hull_storage = NULL,
    int orientation = CV_CLOCKWISE,
    int return_points = 0
);

int cvCheckContourConvexity(
    const CvArr* contour
);

CvSeq* cvConvexityDefects(
    const CvArr* contour,
    const CvArr* convexhull,
    CvMemStorage* storage = NULL
);


คำสั่ง cvConvexHull2 จะเป็นการสร้าง hull ของ contour คำสั่งที่สองจะเป็นการตรวจสอบว่า hull นั้น convex หรือไม่ คำสั่งสุดท้ายจะเป็นการหา convexity defects จาก contour และ convex hull

cvConvexHull2 จะเอา input array เป็น พารามิเตอร์แรก พารามิเตอร์ต่อมาคือ memory storage พารามิเตอร์ที่สามจะกำหนดว่า hull ที่ได้จะวนหรือตามเข็ม พารามิเตอร์สุดท้ายถ้าเป็น 1 จุดต่างๆ จะคืนค่ากลับมาใน array ไม่เช่นนั้น จะคืนค่ามาแต่ indices ที่อ้างไปยัง input

cvCheckContourConvexity รับค่า contour เข้าไปและสามารถตรวจสอบได้ว่า convex หรือไม่ วิธีนี้รวดเร็วและง่าย แต่ถ้า contour ตัดกัน วิธีนี้จะใช้ไม่ได้

cvConvexityDefects จะรับค่า contour, convex hull (จาก cvConvexHull2) มาคำนวณหา convexity defects



Pairwise Geometrical Histograms

เราได้อธิบายถึงการกำหนด contour โดยวิธี freeman chain codes ไปแล้ว ต่อไปนี้จะกล่าวถึงประโยชน์ที่กล่างถึงมากอันหนึ่งคือการนำไปใช้ใน Pairwise Geometrical Histograms (PGH) ซึ่งตัว PGH เป็น extension ชอง chain code histogram (CCH)

CCH เป็น histogram ที่คำนวณโดยนับความถี่ที่เกิดขึ้นในแต่ละ step (ทั้ง 8 steps) ที่ represent contour คุณสมบัิติอย่างหนึ่งของ histogram แบบนี้คือการหมุนวัตถุทุกๆ 45 องศา จะทำให้ histogram เกิดการ cyclic transformation เท่านั้น


รูปซ้าย เป็นรูป contour, freeman chain code และ CCH ของรูปรถถัง
รูปขวา เป็นรูป contour, freeman chain code และ CCH ของรูปรถถังที่หมุน 45 องศา


PGH จะใช้แนวคิดคล้ายๆ วิธีการสร้าง PGH คือให้ เลือก edge อันหนึ่งเป็น base edge แล้วหลังจากนั้นจับคู่กับ edge ที่เหลือทุกอัน เพื่อคำนวณหาค่า dmin, dmax, θ   โดยที่ dmin คือระยะที่สั้นที่สุดระหว่าง edge ทั้งสอง dmax คือระยะที่ยาวที่สุด θ คือมุมระหว่าง edge ทั้งสอง แล้วเปลี่ยน edge อันใหม่ให้เป็น base edge จนครบทุกคู่  PGH จะเป็น histogram สองมิติ ที่มิติแรกเป็น θ มิติที่สองเป็น d ในทุกๆ การจับคู่ของ edge จะมีค่า (dmax, θ) และ (dmin, θ) เกิดขึ้น bins ทั้งสองและระหว่างนั้น จะถูกเพิ่มค่า



ในภาพซ้ายแสดง edge ทั้งสองเส้น(เส้นทึบ)พร้อมค่า dmin, dmax, θ 
ในภาพขวาแสดงถึง histogram ที่จะถูกเพิ่มค่าจาก คู่ edge ทางด้านซ้าย

ฟังก์ชันในการคำนวณค่า PGH คือ

void cvCalcPGH(
    const CvSeq* contour,
    CvHistogram* hist
);

1 comment:

  1. ขอขอบคุณสำหรับเนื้อหา OpenCV ดีๆแบบนี้ครับ
    http://naygo.blogspot.com/

    ReplyDelete