ผู้เขียนบทความ : นายพีรพล ลิ่มพรเจริญ coe#12
- )ความเป็นมา
Coin Segmentation : Python OpenCV
คือ การตรวจจับและค้นหาเหรียญจากภาพ วิดีโอ กล้องแบบเรียลไทม์ด้วย Python + OpenCV
ไลบราลี่ที่นำมาใช้งาน
pip install opencv-python pip install numpy

2. )วัคถุประสงค์
ใช้ OpenCV (Open source Computer Vision) เป็นไลบรารีฟังก์ชันการเขียนโปรแกรม (Library of Programming Functions) โดยส่วนใหญ่จะมุ่งเป้าไปที่การแสดงผลด้วยคอมพิวเตอร์แบบเรียลไทม์ (Real-Time Computer Vision) เดิมทีแล้วถูกพัฒนาโดย Intel แต่ภายหลังได้รับการสนับสนุนโดย Willow Garage ตามมาด้วย Itseez (ซึ่งต่อมาถูกเข้าซื้อโดย Intel) OpenCV เป็นไลบรารีแบบข้ามแพลตฟอร์ม (Cross-Platform) และใช้งานได้ฟรีภายใต้ลิขสิทธิ์ของ BSD แบบโอเพ่นซอร์ส (Open-Source BSD License)
OpenCV ยังสนับสนุนเฟรมเวิร์กการเรียนรู้เชิงลึก (Deep Learning Frameworks) ได้แก่ TensorFlow, Torch/PyTorch และ Caffe
การใช้ประโยชน์
ตัวอย่างการประยุกต์ใช้งาน OpenCV มีดังนี้
- ชุดเครื่องมือคุณลักษณะ 2 มิติและ 3 มิติ (2D and 3D feature toolkits)
- การประมาณระยะในขณะเคลื่อนที่ (Egomotion Estimation)
- ระบบรู้จำใบหน้า (Facial recognition system)
- การจดจำท่าทาง (Gesture recognition)
- ปฏิสัมพันธ์ระหว่างมนุษย์และคอมพิวเตอร์ (Human-Computer interaction; HCI)
ภาษาการเขียนโปรแกรม
OpenCV ถูกเขียนขึ้นด้วยภาษา C++ มีการรองรับ Python, Java และ MATLAB/OCTAVE — API สำหรับอินเทอร์เฟสเหล่านี้สามารถพบได้ในเอกสารออนไลน์ ซึ่งมีการรวมไว้หลากหลายภาษา เช่น C#, Perl, Ch, Haskell และ Ruby ได้รับการพัฒนาเพื่อส่งเสริมการนำมาใช้งานโดยผู้ใช้ที่เพิ่มขึ้น
NumPy คืออะไร ?
NumPy เป็นชื่อของ library ที่ใช้ในการคำนวนทางคณิตศาสตร์ในภาษา Python ซึ่งภายในถูกเขียนด้วยภาษา C จึงทำงานได้เร็วและมีประสิทธิภาพ โดย NumPy มีความสามารถในการจัดการกับอาเรย์หลายมิติและข้อมูลแบบเมทริกซ์
เราสามารถติดตั้ง NumPy ได้ง่ายผ่าน package installer ของ Python ด้วยคำสั่ง
ประโยชน์ที่เจ๋ง ๆ ของ NumPy
มาลองดูประโยชน์ของ NumPy ที่จะเปลี่ยนให้เรื่องยากเป็นเรื่องง่ายหรือเรื่องที่ง่ายอยู่แล้วให้ง่ายขึ้นไปอีก รับรองว่ารู้เอาไว้ไม่เสียหายแน่นอน
3.)ขอบเขต
การใช้งานยังไม่เสถียรเนื่องจากมีการหน่วงเวลา ระยะหนึ่งในการ จับลักษณะที่คล้ายกับตัวเหรียญ อาจเหตุไม่คาดคิดเกิดขึ้นในการใช้งานโปรแกรมอาจเข้าใจว่า วัตถุทรงกลม ที่มีลักษณะใกล้เคียงกัน อาจทำให้เกิดนับ ตัวของจำนวนสิ่งของนั้นไม่ไปด้วย ยังรวมถึงการนับเหรียญด้วยความไว ก็อาจกิดการนับอย่างผิดพลาดได้ เช่น การนำโปรแกรมนี้ ไป สร้างเป็นตู้ ATM แบบฝากเงินโดยตู้นี้สามารถฝากเป็นเหรียญได้ ก็อาจจะเกิด ความไม่เสถียรของโปรเจคนี้ได้
หลักการและทฤษฎี
อาศัยหลักการประมวลผลภาพกับรูปร่างและโครงสร้างของภาพโดยนำคณิตสัณฐานวิทยา (MM : Mathematical Morphology) เพื่อประมวลผลภาพตามหลักทฤษฎีแลตติช เป็นเทคนิคสำหรับการวิเคราะห์และประมวลผลโครงสร้างทางเรขาคณิตบนพื้นฐานของทฤษฎีเซต ทฤษฎีตาข่าย โครงสร้างของเครือข่ายและฟังก์ชั่นแบบสุ่ม นิยมนำมาใช้งานกับภาพดิจิตอลเพื่อวิเคราะห์พื้นผิว ขนาด รูปร่าง พื้นที่นูน การเชื่อมต่อโดยอาศัยตัวดำเนินการ 4 ลักษณะ
การประมวลผลภาพกับรูปร่างและโครงสร้างภาพ เป็นเทคนิคของการประมวลผลภาพที่ขึ้นอยู่กับรูปร่าง ค่าของ Pixels ในภาพ Output ขึ้นอยู่กับการเปรียบเทียบของ Pixels ที่สอดคล้องกันในภาพ Input กับพื้นที่ใกล้เคียง โดยเลือกขนาดและรูปร่างของพื้นที่ใกล้เคียงมาสร้างการดำเนินการทางรูปร่างและโครงสร้างของภาพต่อไป
ซึ่งประกอบไปด้วย
– การขยายภาพ (Dilation)
– การกร่อนภาพ (Erosion)
– การเปิดภาพ (Opening) – การปิดภาพ (Closing)
1.การขยายภาพ (Dilation) สำหรับตรวจสอบและขยายรูปทรงที่มีอยู่ในภาพ Input
ถ้าเป็นภาพสีเทา จะขยายภาพและเพิ่มความสว่างของวัตถุโดยใช้พื้นที่ใกล้เคียงสูงสุด
ถ้าเป็นภาพไบนารี จะขยายภาพและเชื่อมต่อพื้นที่ที่แยกออกจากกันด้วยช่องว่างที่มีขนาดเล็กกว่าองค์ประกอบโครงสร้างและเพิ่ม Pixels เข้าไปที่ขอบด้านนอกของแต่ละวัตถุในภาพ
2.การกร่อนภาพ (Erosion) =
สำหรับลดขนาดของวัตถุและความผิดปกติเล็กๆโดยลบวัตถุที่มีรัศมีเล็กกว่าองค์ประกอบของโครงสร้าง
ถ้าเป็นภาพสีเทา จะลดขนาดวัตถุและลดความสว่างของวัตถุบนพื้นหลังสีเข้ม
โดยใช้พื้นที่ใกล้เคียงต่ำสุด
ถ้าเป็นภาพไบนารี ลบวัตถุที่มีขนาดเล็กกว่าองค์ประกอบของโครงสร้างออกและลบ Pixels ที่ขอบด้านนอกออกจากวัตถุในภาพ
3.การเปิดภาพ (Opening) ใช้สำหรับกำจัดสัญญานรบกวนในรูปร่างและโครงสร้างของภาพกำจัดวัตถุขนาดเล็กออกไปจากพื้นที่มืดของภาพและนำไปวางไว้ในพื้นหลังของภาพ ทำให้ Pixels ภาพถูกเปิดกว้างมากขึ้น การเปิดภาพนิยมใช้ในการค้นหาองค์ประกอบของโครงสร้างเช่น ขอบภาพและมุมภาพ
การปิดภาพ (Closing) => กระทำในทางตรงกันข้ามกับ Opening โดยเป็นการทำให้ Pixels ของภาพเชื่อมต่อกันมากขึ้น
– การเปิดและปิดภาพเป็นการกำจัดสัญญานรบกวนในรูปร่างและโครงสร้างของภาพ
การเปิด = กำจัดวัตถุขนาดเล็ก
การปิด = กำจัดช่องโหว่เล็กๆและเชื่อมต่อ
NumPy (Numeric Python) เป็นโมดูลส่วนเสริมของ Python มีฟังก์ชั่นเกี่ยวกับคณิตศาสตร์และการคำนวณต่างๆ มาให้ใช้งาน ใช้การจัดการข้อมูลชุด (Array) ขนาดใหญ่และเมทริกซ์ (สำหรับสร้างตาราง Matrix ในการประมวลผลภาพ)
– Arrays ของ NumPy มีลักษณะคล้ายกับ list แต่สมาชิกทุกตัวใน array จะต้องเป็นข้อมูลชนิดเดียวกัน โดยทั่วไปแล้วข้อมูลที่เก็บจะเป็นตัวเลขเช่น int หรือ float
คล้าย List แต่ทำไมใช้ Array ???
Arrays มีความสามารถในการดำเนินการเกี่ยวกับข้อมูลที่เป็นตัวเลขจำนวนมากๆ ได้อย่างรวดเร็วและมีประสิทธิภาพมากกว่า list
4).ประโยชน์ที่คาดว่าจะได้รับ
เนื่องจากในขณะนี้ตัวผมยังเป็นนักศึกษาอยู่ ส่วนของตัวโปรเจคนี้ผมทำเพื่อให้เกิดการเรียนรุ้หลักการทำงานให้มากขึ้นและยังคิดที่จะนำไปพัฒนาต่อในอนาคต ตัวผมนั้นได้คิดสิ่งที่จะต่อยอดได้อย่างมากจากโปรเจคนี้ แต่เนื่องจาก มีเวลาศึกษาที่มีข้อจำกัด และยังต้องศึกษาวิชาอื่นๆ ด้วย เลยยังไม่สามารถลงมือทำได้ แต่ ผมจะยกตัวอย่างสิ่งที่ผมอยากทำให้ดู เช่นการนำโปรเจค นี้ไปสร้างเป็นเครื่องนับไข่ไก่ จากสายพานการผลิต ใน1วัน หากเราเป็นเจ้าของฟาร์มไก่ เราไม่สามรถรู้ได้เลย ว่าไก่ที่เราเลี้ยงไว้เพื่อเอาผลผลิต นั้น ออกไข่วันละกี่ฟอง แต่ถ้า ผมสามารถนำ โปรเจคนี้มาทำให้เสถียรได้มากกว่าเดิม จะทำให้ความยากลำบากในการ นับไข่ไก่ จากฟาร์มเป็นไปได้อย่างรวดเร็วขึ้น แถมยังลดรายจ่าย ค่าพนักดูแล หรือคน เก็บไข่จากฟาร์ม เพราะ ผมจะเปลี่ยนฟาร์มเป็น สานพานการผลิตที่มีบล็อคสำหรับเลี้ยงแม่ไก่ เวลาแม่ไก่ออกไข่ก็แค่ปล่อยให้ไหลมาทางสายพาน แล้วนับจำนวนไข่ไก่ที่มีมากมายได้ อย่างง่ายดาย
และอีกหนึ่งความคิดที่ผมพอจะคิดได้ เนื่องจากประสบพบเจอกับตัว เวลาตัวเรานั้นต้องการฝากเงินที่เป็น แบงค์ 100 500 1000 อาจจะไม่มีปัญหา แต่ กลับกัน การฝากเงิน ของผู้ที่อดออมบางประเภท กลับไม่สามารถฝากได้อย่างสะดวก(ถึงจะสามารถนำไปฝากที่ธนาคารได้) แต่ด้วยความยุ่งยากนี้ ผมเลยอยากจะพัฒนาตู้ atm ที่สามารถฝากเหรียญ และนับจำนวน ได้อย่างแม่นยำ เพื่อช่วยลดภาระในการ นับจำนวน และลดเวลาในการฝากเงิน ถึงปัจจุบัน ในประเทศไทยเรา ก็มีตู้atm ที่สามารถฝากเหรียญได้ จากธนาคาร scbแต่เนื่องด้วยความไม่เสถียรของตัวตู้ทำให้ถูกยกเลิก ผมมีความหวังว่าผมจะสามมารถทำตู้นี้ได้ แล้วทำให้คนที่ต้องการฝากเงิน เป็นไปได้อย่างสะดวก มากขึ้น แถมทรัพย์สินทางปัญญาที่ผมคิดขึ้นมาก อาจจะสร้างรายได้ให้ผม มากกว่านั่งทำงาน ติดโต๊ะเป็นพนักงานบริษท ที่ตัวผมไม่ค่อยชอบในการทำอาชีพนี้ เท่าไร และยังมีอีก หลายอุปกรณ์ที่ผมอยากจะนำโปรเจคนี้ไปต่อยอด แต่ด้วยความรู้ที่มีจำกัดในตอนนี้ คงต้อง ปล่อยให้เป็นเรื่องของอนาคต ขอบคุณครับ
5).ความรู้ที่เกี่ยวข้อง
ความรู้ในหลักการทำงานของโปรแกรม python และการใช้งาน
ไลบราลี่
pip install opencv-python pip install numpy ซึ่งมีความเข้าใจได้ไม่ยากเท่าที่ควร และยังง่ายต่อการ นำไปพัฒนา
สำคัญในการทำงานของโปรแกรมในส่วน
1.อ่านภาพจากวิดีโอ & กล้อง
2. Gaussian Blur & Threshold
3.Adaptive Thresholding
4. Morphological Closing
5. แสดงรูปร่างและกรองพื้นที่เหรียญ
6).ผลการดำเนินงาน

7.สรุปผลการนำเสนอแนะ
จากการทดลองทั้งหมดของผม ถ้าคุณได้อ่านมาถึงหัวข้อนี้ จะเห็น ตัวของโปรเจคนี้มีข้อจำกัดที่ไม่ถึงกับใหญ่มากหรือเล็กจนเกิน ตัวของโปรเจคนี้สามารถนำไปต่อยอด หรือเรียนรู้เพื่อเพึ่มเติมความรู้ได้ในระดับหนึ่ง แต่อาจจะไม่ ตอบโจทย์ของผู้คนที่ต้องการแม่นยำแบบสุดๆ เนื่องจากที่ผมได้กล่าวไปข้างต้น ว่าตัวโปรเจคนี้ มีการประวิงเวลาที่พูดได้ว่าระดับนึงเลย แต่ก็ยังสามารถ ใช้งานได้
8.ข้อมูลอ้างอิง
https://dev.to/tinazhouhui/coin-detection-discovering-opencv-with-python-1ka1 การทำงานของโปรเจค
https://medium.com/@nut.ch40/opencv-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3-8771e2a4c414 ความรู้ของ open CV
https://medium.com/@nut.ch40/opencv-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3-8771e2a4c414 ความรู้เรื่อง NumPy