φυβλαςのβλογ
บล็อกของ phyblas



opencv-python เบื้องต้น บทที่ ๕: การเติมรูปร่างต่างๆลงไปในภาพ
เขียนเมื่อ 2020/06/28 18:44
แก้ไขล่าสุด 2024/02/22 10:26

ต่อจาก บทที่ ๔

ในบทนี้จะว่าด้วยเรื่องการเติมรูปร่างต่างๆที่ง่ายๆซึ่งมักใช้บ่อยลงในภาพเช่น เส้นตรง สี่เหลี่ยม วงกลม วงรี รูปหลายเหลี่ยม และตัวหนังสือ




การวาดเส้นตรง

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




อ่านบทถัดไป >> บทที่ ๖



-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> opencv
-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> numpy

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文