Example2: Find Object Keypoint

2 07 2010

20100624

ในการหาจุดที่น่าสนใจในภาพด้วยคอมพิวเตอร์ ที่มักจะได้ผลไม่เหมือนกันกับที่เราหาจุดที่มองเห็นเด่นชัดในการเปลี่ยนแปลงรูปร่างหรือสี เพราะคอมพิวเตอร์มองภาพในรูปแบบของตัวเลขดังนั้นทุกอย่างที่คนมองเห็นจึงถูกเปลี่ยนไปเป็นตัวเลข (เหมือนเรื่องแมทริกซ์ไง) อัลกอริธึมในการมองหาจุดที่น่าสนใจด้วยคอมพิวเตอร์นี้โด่งดังเมื่อ David Lowe เผยแพร่ผลงาน Scale-Invariant Feature Transform หรือ SIFT เมื่อปี 1999[1] ด้วยหลักการที่ว่า เมื่อเรามีภาพถ่ายสำหรับวัตถุใดๆ ในภาพ จุดที่น่าสนใจบนวัตถุสามารถหาได้โดย คำอธิบายคุณลักษณะของฟีเจอร์ ของวัตถุ สิ่งสำคัญคือชุดของคุณลักษณะที่สกัดจากภาพมีประสิทธิภาพการเปลี่ยนแปลงในระดับภาพ (scale), สัญญาณรบกวน(noise), แสงสว่างและการบิดเบือนทางเรขาคณิต จุดประสงค์ของการหาจุดที่น่าสนใจก็เพื่อหาสิ่งที่เหมือนกันในอีกภาพหนึ่งซึ่งมีลักษณะของภาพเปลี่ยนไป เช่นการต่อภาพพานอรามาจากภาพถ่ายเดี่ยวหลายๆใบ การสร้างแบบจำลอง 3 มิติจากภาพถ่าย การมองเห็นของหุ่นยนต์ การหาวัตถุที่สนใจในภาพอื่นๆ และอื่นๆ

SIFT จะทำการหาเฉพาะจุดที่น่าสนใจในภาพเท่านั้น การเทียบกันในภาพอื่นๆ ต้องอาศัยวิธีการอื่นต่อไป

ต่อมาในปี ค.ศ. 2006 Herbert Bay ได้เผยแพร่ Speeded Up Robust Features หรือ SURF พัฒนาขึ้นโดยอาศัยผลรวมของค่าประมาณของการตอบสนองของ 2D Haar wavelet ทำให้สามารถทำงานได้เร็วกว่า SIFT

ใน OpenCV ก็มีฟังก์ชัน SURF ให้ใช้งานการเขียนคำสั่งก็เพียงสั้นๆ ไม่กี่บรรทัดก็ได้ผลลัพธ์แล้ว ผลลัพธ์ที่ได้คือ Object descriptors

python code:

#
# Exercise 2: find object keypoint
#
import sys
import pyopencv as cv
if __name__ == ‘__main__’:
object_filename = “fruits.jpg”
#cv.namedWindow(“Object”, 1)
bluecolor = cv.Scalar(255,128,0)
#read the object images
object_color = cv.imread( object_filename, cv.CV_LOAD_IMAGE_COLOR )
object = cv.Mat(object_color.size(), cv.CV_8UC1)
cv.cvtColor( object_color, object, cv.CV_BGR2GRAY )
# find keypoints on images
surf = cv.SURF(500, 4, 2, True)
mask = cv.Mat()
tt = float(cv.getTickCount())
objectKeypoints = []
objectDescriptors = surf(object, mask, objectKeypoints)
print(“Object Descriptors: %d\n” % len(objectKeypoints))
# draw circles
for keypt in objectKeypoints:
cv.circle(object_color, cv.asPoint(inst_Point2f=keypt.pt), int(keypt.size*1.2/9.*2), bluecolor, 1, 8, 0)
cv.imshow(“Object”, object_color)
cv.waitKey(0)



Actions

Information

3 responses

15 01 2011
Primp

กำลังทำ IS ส่งอาจารย์ค่ะ หาจุดสนใจ โดยใช้มือถือค่ะ
“ผลลัพธ์ที่ได้คือ Object descriptors” ผลลัพธ์นี้ เราสามารถแปลงเป็นรหัสหรือ file อะไรเล็กๆได้ไม๊คะ
เพื่อส่งไปเครื่องserver แล้วทำการ matching กับสิ่งที่อยู่ใน database น่ะค่ะ
ช่วยแนะนำหน่อยค่ะ ขอบคุณมากๆค่ะ

31 01 2011
enumap

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

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

15 01 2011
Primp

🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s




%d bloggers like this: