ต่อจาก
บทที่ ๔
ในบทนี้จะว่าด้วยเรื่องการเติมรูปร่างต่างๆที่ง่ายๆซึ่งมักใช้บ่อยลงในภาพเช่น เส้นตรง สี่เหลี่ยม วงกลม วงรี
รูปหลายเหลี่ยม
และตัวหนังสือ
การวาดเส้นตรง
cv2.line() ใช้สำหรับวาดเส้นตรงเส้นหนึ่งลงไปในภาพ
ค่าที่ต้องใส่ในฟังก์ชันเป็นดังนี้
ลำดับ |
ชื่อ |
สิ่งที่ต้องใส่ |
ชนิดข้อมูล |
1 |
img |
อาเรย์ของรูปภาพ |
np.array |
2 |
pt1 |
ตำแหน่งจุดหนึ่ง |
tuple ของ int |
3 |
pt2 |
ตำแหน่งอีกจุด |
tuple ของ int |
4 |
color |
สี |
tuple ของ int |
5 |
thickness |
ความหนา |
int |
6 |
lineType |
รูปแบบเส้น |
flag |
ช่องที่ทาสีเข้มคือตัวที่สามารถละได้ อย่างฟังก์ชันนี้มีค่าที่ต้องใส่อย่างน้อย ๔ ตัว
ส่วนตัวที่เหลือถ้าไม่ใส่ก็จะใช้ค่าตั้งต้น
ค่าความหนาถ้าไม่ใส่จะหนา 1 ซึ่งเป็นค่าตั้งต้น
ตัวอย่างในบทนี้ขอใช้ภาพนี้เป็นตัวเริ่มต้น แล้วค่อยๆต่อเติมลงไปเรื่อยๆ
gumi05c01.jpg
วาดเส้นลงไป
import cv2
import numpy as np
gumi = cv2.imread('gumi05c01.jpg')
cv2.line(gumi,(150,440),(500,50),(0,0,255))
cv2.line(gumi,(400,70),(150,420),(0,255,0),3)
cv2.line(gumi,(150,400),(300,90),(255,0,0),5)
cv2.imwrite('gumi05c02.jpg',gumi)
gumi05c02.jpg
การวาดเส้นตรงต่อเนื่อง
cv2.polylines() ใช้สำหรับวาดเส้นตรงต่อเนื่องกันหลายเส้นลงไปในภาพ
รายชื่ออาร์กิวเมนต์
ลำดับ |
ชื่อ |
สิ่งที่ต้องใส่ |
ชนิดข้อมูล |
1 |
img |
อาเรย์ของรูปภาพ |
np.array |
2 |
pts |
การการของจุด |
np.array ของ int |
3 |
isClose |
จะเป็นรูปปิดหรือไม่ |
bool |
4 |
color |
สี |
tuple ของ int |
5 |
thickness |
ความหนา |
int |
6 |
lineType |
รูปแบบเส้น |
flag |
ตำแหน่งของจุดนั้นค่อนข้างจะยุ่งยาก คือจะเป็นอาเรย์ ๓ มิติ โดยเป็นลิสต์ของกลุ่มเส้นของกลุ่มจุด
การลากเส้นจะแยกเป็นกลุ่มๆโดยเชื่อมระหว่างแต่ละจุดในกลุ่มเดียงกัน จะไม่มีเส้นต่อกันระหว่างกลุ่ม
สามารถวาดลงไปได้หลายกลุ่มพร้อมกัน
ตัวที่ 3 ถ้าใส่ 1 จะทำให้มีการลากเส้นจากจุดสุดท้ายไปยังจุดแรกเพื่อปิด ถ้าใส่ 0 จะไม่ปิด
ตัวอย่าง เอาภาพจากตัวอย่างที่แล้วมาวาดลงไปอีก
gumi = cv2.imread('gumi05c02.jpg')
pts1 = np.array([
[(110,420),(520,40),(250,150)],
[(200,50),(400,50),(250,110)]
])
cv2.polylines(gumi,pts1,1,(0,0,199),5)
pts2 = np.array([
[(50,250),(100,300),(150,250)],
[(50,350),(100,400),(150,350)]
])
cv2.polylines(gumi,pts2,0,(177,0,33),7)
cv2.imwrite('gumi05c03.jpg',gumi)
gumi05c03.jpg
การวาดสี่เหลี่ยม
cv2.rectangle() ใช้วาดกรอบสีเหลี่ยมลงไปในภาพ
รายการค่าที่ต้องใส่
ลำดับ |
ชื่อ |
สิ่งที่ต้องใส่ |
ชนิดข้อมูล |
1 |
img |
อาเรย์ของรูปภาพ |
np.array |
2 |
pt1 |
ตำแหน่งมุมหนึ่ง |
tuple ของ int |
3 |
pt2 |
ตำแหน่งอีกมุม |
tuple ของ int |
4 |
color |
สี |
tuple ของ int |
5 |
thickness |
ความหนา |
int |
6 |
lineType |
รูปแบบเส้น |
flag |
ความหนาถ้าไม่ใส่จะมีค่าเป็น 1 ถ้าใส่เป็น -1 จะเป็นการระบายปิดทั่วกรอบ
ตัวอย่าง วาดต่อจากเดิม
gumi = cv2.imread('gumi05c03.jpg')
cv2.rectangle(gumi,(75,50),(250,200),(0,150,0),5)
cv2.rectangle(gumi,(270,350),(95,70),(20,90,0),4)
cv2.rectangle(gumi,(330,290),(400,360),(20,120,200),-1)
cv2.imwrite('gumi05c04.jpg',gumi)
gumi05c04.jpg
การวาดวงกลม
cv2.circle() ใช้วาดรูปวงกลมลงไปในภาพ
รายการค่าที่ต้องใส่
ลำดับ |
ชื่อ |
สิ่งที่ต้องใส่ |
ชนิดข้อมูล |
1 |
img |
อาเรย์ของรูปภาพ |
np.array |
2 |
center |
ตำแหน่งใจกลาง (x,y) |
tuple ของ int |
3 |
radius |
รัศมี |
int |
4 |
color |
สี |
tuple ของ int |
5 |
thickness |
ความหนา |
int |
6 |
lineType |
รูปแบบเส้น |
flag |
เช่นเดียวกับคำสั่งวาดสี่เหลี่ยม ถ้าใส่ความหนาเป็น -1 ก็จะเป็นการระบายทับมิดทั่วพื้นที่
ตัวอย่าง
gumi = cv2.imread('gumi05c04.jpg')
cv2.circle(gumi,(400,200),35,(0,100,0),-1)
cv2.circle(gumi,(400,200),75,(50,50,200),4)
cv2.circle(gumi,(400,200),115,(150,50,10),3)
cv2.imwrite('gumi05c05.jpg',gumi)
gumi05c05.jpg
การวาดวงรี
cv2.ellipse() ใช้ใส่วงรีลงไปในภาพ อาจวาดแค่บางส่วนของวง หรือทำให้ตั้งเอียงได้
ค่าที่ต้องใส่มีดังนี้
ลำดับ |
ชื่อ |
สิ่งที่ต้องใส่ |
ชนิดข้อมูล |
1 |
img |
อาเรย์ของรูปภาพ |
np.array |
2 |
center |
ตำแหน่งใจกลาง (x,y) |
tuple ของ int |
3 |
axes |
ขนาด (กว้าง,สูง) |
tuple ของ int |
4 |
angle |
มุมเอียง |
float |
5 |
startAngle |
มุมเริ่มกวาด |
float |
6 |
endAngle |
มุมเริ่มกวาด |
float |
7 |
color |
สี |
tuple ของ int |
8 |
thickness |
ความหนา |
int |
9 |
lineType |
รูปแบบเส้น |
flag |
ตัวอย่าง วาดต่อจากภาพเดิมไปอีก
gumi = cv2.imread('gumi05c05.jpg')
cv2.ellipse(gumi,(190,230),(35,70),75,30,360,(20,0,200),-1)
cv2.ellipse(gumi,(190,250),(85,110),65,0,280,(200,0,100),4)
cv2.imwrite('gumi05c06.jpg',gumi)
gumi05c06.jpg
การใส่รูปปิดหลายเหลี่ยม
cv2.fillConvexPoly() ใช้วาดรูปปิดที่มีกี่เหลี่ยมก็ได้ลงไปในภาพ
ค่าที่ใส่ในฟังก์ชันนี้
ลำดับ |
ชื่อ |
สิ่งที่ต้องใส่ |
ชนิดข้อมูล |
1 |
img |
อาเรย์ของรูปภาพ |
np.array |
2 |
points |
ตำแหน่งมุม |
np.array ของ int |
3 |
color |
สี |
tuple ของ int |
4 |
lineType |
รูปแบบเส้น |
flag |
ฟังก์ชันนี้ไม่มีให้ใส่ค่าความหนา แต่จะได้รูปปิดที่ระบายสีเต็มรูปเสมอ
ตัวอย่าง
gumi = cv2.imread('gumi05c06.jpg')
pts = np.array([(111,333),(555,111),(444,444)])
cv2.fillConvexPoly(gumi,pts,(0,255,255))
cv2.imwrite('gumi05c07.jpg',gumi)
gumi05c07.jpg
การใส่ตัวหนังสือ
cv2.putText() ใช้ใส่ข้อความตัวหนังสือลงไปในภาพ แต่ความสามารถของของฟังก์ชันนี้ค่อนข้างจำกัด ปรับได้แค่ตำแหน่ง ขนาด
รูปแบบฟอนต์
และฟอนต์ที่เลือกได้ในนี้มีไม่เยอะนัก แฟล็กของฟอนต์จะขึ้นต้นด้วย FONT_ ลองดูรายชื่อฟอนต์ที่เลือกได้โดย
print('\n'.join(['%s: %d'%(x,getattr(cv2,x)) for x in dir(cv2) if x[:5]=='FONT_']))
และฟอนต์เหล่านี้ก็ใช้กับภาษาไทยไม่ได้ จึงไม่สามารถพิมพ์ภาษาไทยลงไปด้วยฟังก์ชันนี้ได้
ค่าที่จะต้องใส่ลงในฟังก์ชันนี้
ลำดับ |
ชื่อ |
สิ่งที่ต้องใส่ |
ชนิดข้อมูล |
1 |
img |
อาเรย์ของรูปภาพ |
np.array |
2 |
text |
ข้อความที่จะเขียน |
string |
3 |
org |
ตำแหน่ง |
tuple ของ int |
4 |
fontFace |
รูปแบบฟอนต์ |
flag |
5 |
fontScale |
ขนาดอักษร |
float |
6 |
color |
สี |
tuple ของ int |
7 |
thickness |
ความหนา |
int |
8 |
lineType |
รูปแบบเส้น |
flag |
ตัวอย่าง วาดตัวหนังสือใส่ภาพต่อจากตัวอย่างที่แล้ว
gumi = cv2.imread('gumi05c07.jpg')
cv2.putText(gumi,'opencv',(250,100),cv2.FONT_HERSHEY_SIMPLEX,3,(0,255,150),4)
cv2.putText(gumi,'baka',(50,230),cv2.FONT_HERSHEY_DUPLEX,4,(0,155,255),6)
cv2.putText(gumi,'gumi',(120,350),cv2.FONT_HERSHEY_SCRIPT_COMPLEX,7,(155,55,230),6)
cv2.imwrite('gumi05c08.jpg',gumi)
gumi05c08.jpg
อ่านบทถัดไป >>
บทที่ ๖