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

มนุษย์เรานั้นใช้วิธีการนับจำนวนสิ่งของด้วยการนับมือหรือเครื่องนับมาอย่างยาวนาน แต่ในการนับแต่ละครั้งนั้นมักพบปัญหาไม่ว่าจะเป็นการนับมือที่อาจจะลืมได้ตลอดเวลาว่านับถึงเท่าใดเมื่อเผลอสมาธิหลุดแล้วสิ่งของนั้นมีจำนวนมาก หรือการนับด้วยเครื่องนับที่อาจจะใช้เวลานานหรือค่าใช้จ่ายที่มากขึ้น จะดีกว่าไหมหากในยุคนี้ที่ 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 

```


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

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

```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/99xii29zly9d3002ue91.png)

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

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

```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fqtpbji3lg6qw11r53jz.png)

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

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

```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ox0ak9j2x41xgdxeu0na.png)

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

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

```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yd2h52limlhmeeal9sbp.png)

## ขั้นตอนที่ 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) 

```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9j5shnc4iojs2cut246w.png)

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

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

```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pcuhkeazxp1anuswyv97.png)

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

```
# 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()

```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n6xlmuiamno5demn23md.png)

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

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