Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การวาดรูปทรงเรขาคณิตบนภาพด้วย Python OpenCV

การดำเนินการพื้นฐานของ 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) จะเป็นสีน้ำเงิน ไม่ใช่สีแดง