มาเล่น OpenCV กันเถอะ [2]

Chiwin Charngtong
3 min readMar 31, 2019

--

ตัวอย่างรูปที่ใช้ทดสอบ

ในบทความที่แล้วเราได้ทำการติดตั้ง OpenCV กันเป็นที่เรียบร้อยไปแล้ว และอย่างที่กล่าวทิ้งท้ายไปในบทความที่แล้วไว้ว่า ในบทความนี้ เราจะมาเริ่มต้นใช้ฟังก์ชันง่ายๆ ของ OpenCV เกี่ยวกับรูปภาพกัน

ตัวอย่างรูปที่ใช้ทดสอบ

การอ่านรูปภาพ

เราจะใช้ฟังก์ชัน cv2.imread() ในการอ่านรูปภาพ รูปแบบของฟังก์ชันจะเป็น
cv2.imread(‘name’, flag) โดย
name คือ ชื่อรูปภาพ (กรณีที่ program และ รูปภาพอยู่ใน path เดียวกัน) หรือ path ของรูปภาพ (กรณีที่ program และ รูปภาพไม่อยู่ใน path เดียวกัน)
flag คือ ค่าที่จะบ่งชี้ว่าอ่านรูปมาแล้วให้มีคุณสมบัติอย่างไร ตัวอย่าง flag เช่น

cv2.IMREAD_COLOR : อ่านมาเป็นรูปสี โดยไม่สนใจความโปร่งใส่ของรูปภาพ นอกจากนี้หากเราไม่ใส่ค่า flag ใน cv2.imread โปรแกรมจะกำหนดค่า flag ให้เป็น cv2.IMREAD_COLOR โดยอัตโนมัติ

cv2.IMREAD_GRAYSCALE : อ่านมาเป็นรูปขาวดำ

cv2.IMREAD_UNCHANGED : อ่านมาโดยรวม Alpha Channel มาด้วย

ทั้งนี้เรายังสามารถใส่ค่า flag เป็นตัวเลขได้อีกด้วย เช่น
ใส่ 1 เพื่อแทน cv2.IMREAD_COLOR
ใส่ 0 เพื่อแทน cv2.IMREAD_GRAYSCALE
ใส่ -1 เพื่อแทน cv2.IMREAD_UNCHANGED

การแสดงรูปภาพ

เราจะใช้ฟังก์ชัน cv2.imshow() ในการแสดงรูปภาพ โดยที่ขนาดหน้าต่างของรูปจะปรับตามขนาดของรูปที่โชว์ให้โดยอัตโนมัติ รูปแบบของฟังก์ชันจะเป็น
cv2.imshow(‘window name’, picture) โดย
window name คือ ข้อความที่จะแสดงบนหน้าต่างรูปภาพ
picture คือ รูปภาพจากการอ่านที่เราจะนำมาแสดง
ทั้งนี้ผู้อ่านสามารถแสดงได้พร้อมกันหลายๆหน้าต่าง โดยมีข้อแม้ว่าแต่ละหน้าต่างชื่อจะต้องไม่ซ้ำกันนั่นเอง

การรอการกดปุ่มจาก keyboard และ การปิดหน้าต่างทั้งหมด

เราจะใช้ฟังก์ชัน cv2.waitkey() ในการรอกดปุ่มจาก keyboard รูปแบบของฟังก์ชันจะเป็น cv2.waitkey(time) โดย
time หมายถึง ค่าเวลาในหน่วย milliseconds ซึ่งจะหมายถึงระยะเวลาที่จะรอการกดปุ่มก่อนที่โปรแกรมจะทำงานในบรรทัดต่อไป หรือหากไม่มีการกดปุ่มภายในเวลาที่กำหนดโปรแกรมจะทำงานในบรรทัดต่อไปเช่นกัน และถ้าหากเราใส่ค่า time ตัวนี้เป็นค่า 0 นั่นจะหมายถึงโปรแกรมไม่มีการนับเวลาแต่จะการกดปุ่มเพียงอย่างเดียว โปรแกรมจึงจะทำงานในบรรทัดต่อไป

เราจะใช้ฟังก์ชัน cv2.destroyAllWindows() ในการปิดทุกหน้าต่างที่ทำการแสดงขึ้น

ตัวอย่างการใช้งาน

import cv2img1 = cv2.imread('tottenham_hotspur_1995.png',cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('tottenham_hotspur_1995.png',cv2.IMREAD_COLOR)
img3 = cv2.imread('tottenham_hotspur_1995.png',cv2.IMREAD_UNCHANGED)
'''
หรือจะใช้แบบนี้ก็ได้
img1 = cv2.imread('tottenham_hotspur_1995.png',0)
img2 = cv2.imread('tottenham_hotspur_1995.png',1)
img3 = cv2.imread('tottenham_hotspur_1995.png',-1)
'''
cv2.imshow('This is GRAY',img1)
cv2.imshow('This is COLOR',img2)
cv2.imshow('This is UNCHANGED',img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

ผลจากการรันโปรแกรม

และเมื่อเรากดปุ่มจาก keyboard ปุ่มใดปุ่มหนึ่ง หน้าต่างทั้งสามก็จะปิดลง

การปรับตั้งหน้าต่าง

ก่อนที่จะสั่งแสดงรูปภาพ เราสามารถจะกำหนดชื่อและลักษณะของหน้าต่างแสดงรูปภาพเอาไว้ก่อนได้ โดยใช้ฟังก์ชัน cv2.namedWindow() รูปแบบของฟังก์ชันจะเป็น cv2.namedWindow(‘window name’,flag) โดย
window name คือ ข้อความที่จะแสดงบนหน้าต่างรูปภาพ
flag คือ คุณสมบัติของหน้าต่าง ตัวอย่าง flag เช่น

cv2.WINDOW_NORMAL : รูปแบบปกติทั่วไปสามารถลดหรือขยายได้ รูปภาพจะเปลี่ยนแปลงตามขนาดของหน้าต่าง

cv2.WINDOW_AUTOSIZE : ขนาดหน้าต่างจะเท่ากับขนาดรูปภาพ ไม่สามารถปรับขนาดได้แต่จะสามารถกด Maximize ได้ แต่ขนาดของรูปจะไม่เปลี่ยนตาม

ตัวอย่างการใช้งาน

import cv2img1 = cv2.imread('Lion.jpg',1)cv2.namedWindow('Normal',cv2.WINDOW_NORMAL)
cv2.namedWindow('Autosize',cv2.WINDOW_AUTOSIZE)
cv2.imshow('Normal',img1)
cv2.imshow('Autosize',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

ผลจากการรันโปรแกรม

และเมื่อเรากดปุ่มจาก keyboard ปุ่มใดปุ่มหนึ่ง หน้าต่างทั้งสองก็จะปิดลง

การเขียนรูปภาพ

เราจะใช้ฟังก์ชัน cv2.imwrite() ในการบันทึกรูปภาพ รูปแบบของฟังก์ชันจะเป็น
cv2.imwrite(‘name’, image) โดย
name คือ ชื่อรูปภาพที่ต้องการบันทึก
image คือ รูปภาพที่ต้องการบันทึก

การรับค่าปุ่มกดจาก keyboard

เราจะใช้คำสั่ง k = cv2.waitKey(0) & 0xFF เพื่อนำค่าจากการกด keyboard มาเก็บไว้ที่ตัวแปร k โดยแต่ละปุ่มของ keyboard จะมีค่าตามตาราง ASCII Codes ดังนี้

ASCII Table

หรือจะใช้ฟังก์ชัน ord(‘char’) เพื่ออ่านค่าตัวอักษรในวงเล็บ (char) ก็ได้

ตัวอย่างการใช้งาน

import numpy as np
import cv2
img = cv2.imread('Lion.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0) & 0xFF
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
cv2.imwrite('Liongray.png',img)
cv2.destroyAllWindows()

ผลจากการรันโปรแกรม

ถ้าเรากดปุ่ม esc หน้าต่างจะปิดลง
ถ้าเรากดปุ่ม s โปรแกรมจะทำการบันทึกรูปภาพที่ปรากฎโดยไฟล์รูปภาพจะมีชื่อว่า Liongray.png และตัวไฟล์รูปภาพจะอยู่ในที่เดียวกันกับที่ที่เราบันทึกตัวโปรแกรมเอาไว้
ถ้าเรากดปุ่มอื่นโปรแกรมจะสิ้นสุดการทำงานแต่ไม่มีการปิดหน้าต่างหรือทำการบันทึกใดๆ

การใช้ Matplotlib

Matplotlib เป็น ไลบรารี่ ที่ใช้ในการเขียนกราฟ แต่ ไลบรารี่ ตัวนี้ยังสามารถนำมาใช้ในการจัดการเกี่ยวกับรูปภาพได้อีกด้วย เช่น การแสดงรูปภาพ การซูม หรือ การบันทึก เป็นต้น

การแสดงรูปภาพด้วย Matplotlib

เราจะใช้ฟังก์ชัน matplotlib.pyplot.imshow() ในการแสดงรูปภาพอยู่ภายในหน้าต่าง รูปแบบของฟังก์ชันจะเป็น matplotlib.pyplot.imshow(image) โดย
image คือ รูปภาพที่ต้องการแสดง
จากตัวอย่างด้านล่างจะเห็นว่าเราจะแทนที่ matplotlib.pyplot ด้วย plt โดยจะประกาศไว้ด้านบนของโปรแกรม (หลังจากนี้ผู้เขียนขอใช้ plt แทน matplotlib.pyplot) แต่เฉพาะคำสั่ง plt.imshow() อย่างเดียว ตัวหน้าต่างที่มีรูปที่เราจะแสดงจะยังไม่ปรากฎออกมา เราจะต้องใช้อีกคำสั่งหนึ่งคือ plt.show() เพื่อเรียกหน้าต่างนี้ออกมาและจะใช้คำสั่ง plt.xticks([]), plt.yticks([]) ในการลบตัวเลขในแนวแกน x และ แกน y ออกไป

ตัวอย่างการใช้งาน

import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('Lion.jpg',1)
plt.imshow(img)
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()

ผลจากการรันโปรแกรม

จะสังเกตได้ว่ารูปภาพที่นำมาโชว์นั้นทำไมถึงไม่เหมือนกับต้นฉบับ เหตุผลคือ การใช้คำสั่งใน Opencv (ในที่นี้คือฟังก์ชัน cv2.imread()) ภาพจะเรียงช่องสีแบบ BGR แต่ใน Matplotlib ภาพจะเรียงช่องสีแบบ RGB ดังนั้นเราควรปรับช่องสีของภาพให้เหมมาะสมก่อนด้วยฟังชั่น cv2.cvtColor() รูปแบบฟังก์ชันจะเป็น cv2.cvtColor(image,flag) โดย
image คือ รูปภาพที่ต้องการปรับช่องสี
flag คือ ค่าที่จะบ่งชี้ว่ารูปจะปรับช่องสีอย่างไร ตัวอย่าง flag เช่น
cv2.COLOR_BGR2RGB จะเป็นการปรับภาพจากช่องสี BGR เป็น RGB เป็นต้น

ตัวอย่างการใช้งาน

import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('Lion.jpg',1)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()

ผลจากการรันโปรแกรม

ในบทความถัดไปนั้นเราจะมาเริ่มการใช้งานคำสั่งง่ายๆเกี่ยวกับ Video กันครับ ^^

By ปลั๊กกาเป้า

ข้อมูลอ้างอิง
https://docs.opencv.org/master/dc/d2e/tutorial_py_image_display.html

--

--