φυβλαςのβλογ
บล็อกของ 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)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文