การดำเนินการพื้นฐานของ OpenCV คือการวาดบนภาพ ซึ่งสามารถเพิ่มรูปทรงเรขาคณิตต่างๆ ได้ เช่น เส้นตรง วงกลม สี่เหลี่ยมผืนผ้า เป็นต้น
เมื่อทำงานกับการวิเคราะห์ภาพ เรามักต้องการเน้นส่วนหนึ่งของภาพ เช่น การเพิ่มสี่เหลี่ยมผืนผ้าเพื่อกำหนดพื้นที่นั้น หรือเพิ่มลูกศรเพื่อชี้ไปยังสิ่งต่างๆ
ฟังก์ชันหลักสำหรับการวาด
- cv2.line() - ใช้วาดเส้นตรงบนภาพ
- cv2.rectangle() - ใช้วาดสี่เหลี่ยมผืนผ้าบนภาพ
- cv2.circle() - ใช้วาดวงกลมบนภาพ
- cv2.putText() - ใช้เขียนข้อความบนภาพ
- cv2.ellipse() - ใช้วาดวงรีบนภาพ
- cv2.polylines() - ใช้วาดรูปหลายเหลี่ยมบนภาพ
ตัวอย่างโค้ดพื้นฐาน: สร้างภาพว่าง
import numpy as np
import cv2
my_img = np.zeros((350, 350, 3), dtype="uint8")
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
การวาดเส้นตรง (Line)
ฟังก์ชัน cv2.line() รับอาร์กิวเมนต์ 5 ตัว:
- ออบเจ็กต์ภาพที่จะวาด
- พิกัดจุดเริ่มต้น (x, y)
- พิกัดจุดสิ้นสุด (x, y)
- สีเส้นในรูปแบบ BGR (ไม่ใช่ RGB)
- ความหนาของเส้น (พิกเซล)
import numpy as np
import cv2
my_img = np.zeros((350, 350, 3), dtype="uint8")
cv2.line(my_img, (202, 220), (100, 160), (0, 20, 200), 10)
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
การวาดสี่เหลี่ยมผืนผ้า (Rectangle)
ฟังก์ชัน cv2.rectangle() รับพารามิเตอร์ 5 ตัว:
- ออบเจ็กต์ภาพที่จะวาด
- พิกัดมุมบนซ้าย (x, y)
- พิกัดมุมล่างขวา (x, y)
- สีเส้นในรูปแบบ BGR
- ความหนาของเส้น (พิกเซล)
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype="uint8")
cv2.rectangle(my_img, (30, 30), (300, 200), (0, 20, 200), 10)
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
การวาดวงกลม (Circle)
ฟังก์ชัน cv2.circle() รับพารามิเตอร์ 5 ตัว:
- ออบเจ็กต์ภาพที่จะวาด
- พิกัดจุดศูนย์กลาง (x, y)
- รัศมีของวงกลม
- สีเส้นในรูปแบบ BGR
- ความหนาของเส้น (พิกเซล)
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype="uint8")
cv2.circle(my_img, (200, 200), 80, (0, 20, 200), 10)
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
การวาดวงรี (Ellipse)
ฟังก์ชัน cv2.ellipse() รับพารามิเตอร์ 8 ตัว:
- ออบเจ็กต์ภาพที่จะวาด
- พิกัดจุดศูนย์กลาง (x, y)
- ความยาวแกนรองและแกนหลัก (h, w)
- มุมการหมุนของวงรี (คำนวณทวนเข็มนาฬิกา)
- มุมเริ่มต้น (คำนวณตามเข็มนาฬิกา)
- มุมสิ้นสุด (คำนวณตามเข็มนาฬิกา)
- สีเส้นในรูปแบบ BGR
- ความหนาของเส้น
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype="uint8")
cv2.ellipse(my_img, (256, 256), (100, 50), 0, 0, 180, 255, -1)
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
การวาดรูปหลายเหลี่ยม (Polygon)
ฟังก์ชัน cv2.polylines() ต้องการอาร์กิวเมนต์ 5 ตัว:
- ออบเจ็กต์ภาพที่จะวาด
- อาร์เรย์ของพิกัด
- True หากเป็นเส้นปิด
- สีเส้น
- ความหนาของเส้น
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype="uint8")
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(my_img, [pts], True, (0,255,255))
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
การเขียนข้อความ (Text)
ฟังก์ชัน cv2.putText() รับพารามิเตอร์หลายตัว:
- ภาพที่จะวาด
- ข้อความที่จะเขียน
- พิกัดจุดเริ่มต้นของข้อความ
- แบบอักษรที่ใช้
- ขนาดตัวอักษร
- สีข้อความ
- ความหนาของข้อความ
- ประเภทของเส้นที่ใช้
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype="uint8")
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(my_img, 'Tutorials Point', (50, 50), font, 0.8, (255, 0, 0), 2, cv2.LINE_AA)
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
หมายเหตุสำคัญ: OpenCV ใช้รูปแบบสี BGR ไม่ใช่ RGB ดังนั้น (255, 0, 0) จะเป็นสีน้ำเงิน ไม่ใช่สีแดง