DEV Community

Cover image for เมื่อการนับจำนวนสิ่งของแบบ manual มันเหนื่อยเกินไป AI จาก Python-Open CV ตัวนี้จะช่วยคุณในการนับจำนวนสิ่งของให้เอง
Nattapol
Nattapol

Posted on

เมื่อการนับจำนวนสิ่งของแบบ manual มันเหนื่อยเกินไป AI จาก Python-Open CV ตัวนี้จะช่วยคุณในการนับจำนวนสิ่งของให้เอง

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

โมดูลที่ต้องใช้

Open CV เป็นโมดูลที่ได้รับความนิยมในการนำไปใช้เกี่ยวกับ Image processing หรือได้จนถึงซอฟแวร์จำพวก Detection เป็นต้น
Numpy เป็นโมดูลที่ใช้ในการคำนวณหรือ task ที่เกี่ยวกับคณิตศาสตร์เป็นต้น
Matplotlib เป็นไลบรารีที่ใช้ในการ Visualize ข้อมูลให้เห็นภาพชัดขึ้นเช่นการ Generate กราฟ เป็นต้น

ขั้นตอนที่ 1 Import โมดูลและไลบรารีเข้ามาใช้ใน Project

Import Module และ Library ทั้งสามตัวเข้ามาใช้งานได้ดังนี้

# Import libraries 
import cv2 
import numpy as np 
import matplotlib.pyplot as plt 

Enter fullscreen mode Exit fullscreen mode

ขั้นตอนที่ 2 แปลงรูปภาพให้ง่ายเหมาะแก่การแยกจำนวนด้วยการใช้ Gray Scale

ขั้นตอนนี้เราจะใช้ Function Gray scale จากโมดูล Open-CV มาทำให้ภาพนั้นเป็นสีเทาหรือขาวดำเพื่อให้ง่ายต่อการแยกวัตถุมากขึ้นโดยมีคำสั่งดังนี้

image = cv2.imread('ชื่อไฟล์รูปภาพ') 
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
plt.imshow(gray, cmap='gray') 

Enter fullscreen mode Exit fullscreen mode

Image description

ขั้นตอนที่ 3 แปลงรูปภาพเพื่อลด Noise ของภาพด้วย GaussianBlur

ลด Noise ของภาพด้วยการใช้ GaussianBlur ตามคำสั่งดังนี้ “cv2.GaussianBlur(ชื่อตัวแปรภาพ, ค่า Kernal, ค่า std. deviation)”.

blur = cv2.GaussianBlur(gray, (11, 11), 0) 
plt.imshow(blur, cmap='gray') 

Enter fullscreen mode Exit fullscreen mode

Image description

ขั้นตอนที่ 4 แปลงรูปภาพให้แสดงแต่ขอบด้วย Canny

แปลงรูปภาพให้เป็นรูปที่แสดงแต่ขอบ (edge) เพื่อให้ง่ายต่อการแยกวัตถุด้วยฟังก์ชัน canny algorithm

canny = cv2.Canny(blur, 30, 150, 3) 
plt.imshow(canny, cmap='gray') 

Enter fullscreen mode Exit fullscreen mode

Image description

ขั้นตอนที่ 5 แปลงรูปภาพให้แสดงขอบได้ชัดขึ้นด้วย Canny

แปลงรูปภาพที่แสดงแต่ขอบ (edge) ให้ขอบนั้นชัดยิ่งขึ้นด้วย algorithm

dilated = cv2.dilate(canny, (1, 1), iterations=0) 
plt.imshow(dilated, cmap='gray') 

Enter fullscreen mode Exit fullscreen mode

Image description

ขั้นตอนที่ 6 แปลงขอบให้แสดงเป็นสีด้วยการเปลี่ยนสี RGB เป็น BGR และใช้ cv2.drawContours และคำนวนจำนวนวัตถุจากขอบ contour เส้นร่างของวัตถุ

(cnt, hierarchy) = cv2.findContours( 
    dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 
cv2.drawContours(rgb, cnt, -1, (0, 255, 0), 2) 

plt.imshow(rgb) 

Enter fullscreen mode Exit fullscreen mode

Image description

ขั้นตอนที่ 7 เขียนคำสั่งแสดงผลการนับด้วยการใช้ print

print("Object in the image : ", len(cnt)) 

Enter fullscreen mode Exit fullscreen mode

Image description

โดยตัวอย่างของโค้ดทั้งหมดที่ได้ดัดแปลงให้แสดงผลรูปทีละขั้นตอนมีดังนี้

# import โมดูลต่างๆมาใช้งาน
import cv2 
import numpy as np 
import matplotlib.pyplot as plt 

image = cv2.imread('colorball.jpg') 

# แปลงเป็นภาพขาวดำ
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 

# ทำการ Blur ด้วย Gaussian
blur = cv2.GaussianBlur(gray, (11, 11), 0) 

# ใช้ Canny Edge Detection
canny = cv2.Canny(blur, 30, 150, 3) 

# ทำการ Dialate
dilated = cv2.dilate(canny, (1, 1), iterations=0) 

# ค้นหา Contours
(cnt, hierarchy) = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 

# แปลง BGR เป็น RGB เพื่อใช้ใน Matplotlib
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 

# วาด Contours บนภาพ RGB
cv2.drawContours(rgb, cnt, -1, (0, 255, 0), 2)

# แสดงผลลัพธ์ทั้งหมด
plt.figure(figsize=(12, 6))

# แสดงรูป Gray
plt.subplot(2, 3, 1)
plt.imshow(gray, cmap='gray')
plt.title('Gray')

# แสดงรูป Blur
plt.subplot(2, 3, 2)
plt.imshow(blur, cmap='gray')
plt.title('Blur')

# แสดงรูป Canny
plt.subplot(2, 3, 3)
plt.imshow(canny, cmap='gray')
plt.title('Canny')

# แสดงรูป Dialated
plt.subplot(2, 3, 4)
plt.imshow(dilated, cmap='gray')
plt.title('Dilated')

# แสดง Contours
plt.subplot(2, 3, 5)
plt.imshow(rgb)
plt.title('Contours')

plt.tight_layout()
print("Object in the image:", len(cnt))
plt.show()

Enter fullscreen mode Exit fullscreen mode

Image description

สรุป

จากขั้นตอนต่างๆที่ได้กล่าวไปข้างต้นนั้นได้แสดงให้เห็นถึงคอนเซปต์คร่าวๆของการทำงานของ AI ตัวนี้คือการใช้ OpenCV ในการทำ task เกี่ยวกับการจัดการรูปไม่ว่าจะเป็นการทำให้เบลอหรือการสร้างขอบเส้นและนำมาคำนวณด้วยฟังก์ชันจากโมดูล Numpy ที่ import เข้ามาเพื่อใช้ในการคำนวณจำนวนนั่นเองซึ่งหากผู้อ่านสนใจอยากนำไปพัฒนาให้ Advance ขึ้นก็สามารถต่อยอดได้เช่นเปลี่ยนจากการคำนวณจากรูปเป็นจากกล้องแบบเรียลไทม์ได้หรือจะนำไปต่อยอดโดยการปรับค่าต่างๆให้สามารถ Detect วัตถุให้แม่นยำและ accurate ได้ขึ้นอีกด้วย

แหล่งที่มา https://www.geeksforgeeks.org/count-number-of-object-using-python-opencv/

Top comments (0)