ในบทความนี้จะเขียนถึงวิธีการใช้มอดูล opencv ในภาษาไพธอนในระดับเบื้องต้น
opencv คืออะไร
opencv เป็น
ซอฟต์แวร์โอเพนซอร์ซที่เอาไว้ใช้จัดการรูปภาพ เริ่มพัฒนาขึ้นโดยบริษัท
อินเทล (Intel) ในปี 1999 คำว่า opencv ย่อมาจาก open
source computer vision
ขอบเขตการใช้งานของ opencv ค่อนข้างกว้าง มีความสามารถหลากหลายหลากหลาย
นอกจากรูปภาพธรรมดาแล้วยังใช้จัดการกับวีดีโอภาพเคลื่อนไหว
อัลกอริธึมที่ใช้มีตั้งแต่แบบง่ายๆไปจนถึงระดับสูงซึ่งรวมถึงการใช้เทคนิค
การเรียนรู้ของเครื่อง ด้วย
opencv เขียนขึ้นจากภาษาซี แต่สามารถเรียกใช้ผ่านภาษาอื่นเช่น ไพธอน, จาวา, แมตแล็บ ได้ด้วย
ใช้ได้ในระบบปฏิการหลากหลายทั้ง Windows, Linux, OS X, Android, iOS
opencv-python คือมอดูลในภาษาไพธอน ซึ่งใช้สำหรับเขียนโปรแกรมใช้งาน opencv ผ่านภาษาไพธอนได้
ตราสัญลักษณ์ของ opencv เป็นวงล้อสีแดงเขียวน้ำเงิน โดยด้านบนสีแดงเป็นสัญลักษณ์ของโอเพนซอร์ซ ส่วนสีเขียวทำเป็นตัว c
สีน้ำเงินคล้ายตัว v
ตัวอย่างภาพที่ปรับแต่งด้วย opencv
ตัวอย่างงานที่ทำได้ด้วย opencv
การจัดการกับรูปภาพ
- แปลงสีภาพ
- นำภาพมาย่อ ขยาย บิด หมุน พลิก ฯลฯ
- ทำการแปลงสัณฐาน (morphology) ของรูปภาพ
- คอนโวลูชันกับตัวกรอง
- ค้นหาขอบหรือมุมในรูปภาพ
- วิเคราะห์ฮิสโทแกรม
- เชื่อมโยงภาพ
- แบ่งเขตภาพ
- หาเค้าโครงภาพ
- ค้นหาสิ่งที่ต้องการภายในภาพ
- ปรับแต่งภาพที่ถ่ายด้วยกล้อง
- คืนภาพจากสามมิติกลับเป็นสองมิติ
การจัดการภาพเคลื่อนไหว
- จับการเคลื่อนไหวของวัตถุ
- วิเคราะห์แยกฉากหลัง
- ออปติคัลโฟลว์ (optical flow)
- อ่านเขียนวีดีโอ
การเรียนรู้ของเครื่อง
- ตัวจำแนกแบบเบส์อย่างง่าย (naive Bayes classifier)
- วิธีการเพื่อนบ้านใกล้สุด k ตัว (k nearest neighbors)
- เครื่องเวกเตอร์ค้ำยัน (SVM)
- ต้นไม้ตัดสินใจ (desicion tree)
- ป่าสุ่ม (random forest)
การใช้ opencv ในไพธอน
แม้ว่า opencv จะเขียนขึ้นจากภาษาซีและทำงานในภาษาซีเป็นหลัก
แต่สามารถเรียกใช้ผ่านภาษาโปรแกรมระดับสูงที่เขียนง่ายๆเช่นไพธอนได้
การเขียนในไพธอนนั้นข้อดีก็คือเขียนง่ายกว่าเขียนในภาษาซีโดยตรง แม้จะมีข้อเสียคือทำงานช้าไปบ้าง
แต่การทำงานของคำสั่งต่างๆใน opencv นั้นโดยหลักๆแล้วจะไปเรียกใช้ฟังก์ชันซึ่งเขียนในภาษาซี
ไม่ได้เขียนด้วยไพธอนโดยตรง
เมื่อการทำงานเบื้องหลังเป็นภาษาซีจึงทำงานรวดเร็ว ไม่ต้องห่วงว่าใช้ในไพธอนแล้วจะช้าลงกว่าใช้ในภาษาซีโดยตรงมากนัก
แต่ก็เพราะ opencv ยืนพื้นจากภาษาซีเป็นหลัก จึงทำให้มีลักษณะการใช้งานที่ออกจะเป็นสไตล์ภาษาซี แม้จะใช้ผ่านไพธอนก็ตาม
ซึ่งคนที่เขียนไพธอนเป็นหลักอาจรู้สึกไม่คุ้นชินอยู่บ้าง
อีกทั้งภาษาไพธอนมีมอดูลอื่นๆหลากหลายซึ่งสามารถนำมาใช้ร่วมกันเพื่อทำงานได้ยืดหยุ่นกว้างขวางขึ้น
เรื่องหนึ่งที่สร้างความยุ่งยากในการใช้ opencv-python ก็คือเรื่องของชนิดตัวแปร
เพราะในภาษาไพธอนมักจะแบ่งแค่ว่าเป็นจำนวนเต็ม (int) และจำนวนจริง (float)
แถมยังสามารถแปลงไปมาโดยอัตโนมัติตามความเหมาะสมโดยไม่ต้องคอยใส่ใจตลอดด้วย
แต่ฟังก์ชันต่างๆของ opencv จะมีกำหนดชนิดของตัวแปรที่ใช้งานได้อยู่ ส่วนใหญ่จะไม่มีการเปลี่ยนชนิดตัวแปรให้โดยอัตโนมัติ
อีกทั้งตัวแปรก็ไม่ได้แบ่งแค่ int กับ float แต่ int ก็มี int หลายชนิด float หลายชนิด
ซึ่งต่างกันที่จำนวนบิตขนาดข้อมูลที่ใช้เก็บค่า ถ้าใช้ผิดชนิดก็อาจทำงานได้ไม่ถูกต้อง
ข้อมูลรูปภาพเป็นตัวเลขตั้งแต่ 0 ถึง 255 โดยทั่วไปจึงใช้ข้อมูลชนิด uint8 ซึ่งเป็นจำนวนเต็มบวกขนาด ๘ บิต
ฟังก์ชันส่วนใหญ่ของ opencv ก็ใช้กับตัวแปรชนิดนี้
อย่างไรก็ตาม uint8 ไม่สามารถเก็บข้อมูลติดลบได้ บางฟังก์ชันที่ต้องทำงานกับค่าลบอาจใช้ int32 (จำนวนเต็ม ๓๒ บิต) เป็นหลัก
และถ้าต้องทำงานกับจำนวนที่ไม่ใช่จำนวนเต็มแต่มีทศนิยมก็จะใช้ float32 (จำนวนจริง ๓๒ บิต)
ปกติในไพธอน int และ float จะหมายถึง int64 และ float64 ซึ่งก็สามารถใช้แทนเมื่อทำงานใน opencv ได้เช่นกันในกรณีส่วนใหญ่
แต่ไม่ใช่ทั้งหมด บางครั้งจึงจำเป็นต้องเปลี่ยนเป็น int32 หรือ float32 ด้วย
รายละเอียดเรื่องชนิดตัวแปรจะไปเขียนถึงตอนอธิบายวิธีใช้ฟังก์ชันอีกที
ถ้าฟังก์ชันนั้นมีความจำเพาะเรื่องชนิดข้อมูลที่ใช้งาน
โดยรวมแล้ว opencv มีการใช้งานหลายอย่างที่ดูแปลกๆไปจากมอดูลที่เขียนด้วยไพธอนทั่วไป
บางทีอาจรู้สึกไม่เข้าใจว่าทำไมต้องเป็นอย่างนั้น ซึ่งตรงนี้ที่จริงก็เป็นเพราะเดิมทีเป็นมอดูลที่ใช้ในภาษาซีนั่นเอง
ความสัมพันธ์กับ numpy และ matplotlib
opencv จัดการกับข้อมูลรูปภาพในรูปแบบที่เป็นอาเรย์ซึ่งเก็บค่าความสว่างของแต่ละจุดในภาพ สำหรับในไพธอน
อาเรย์นั้นก็คืออาเรย์ของมอดูล numpy
numpy เป็นมอดูลที่ใช้คำนวณทางคณิตศาสตร์ มีเบื้องหลังการทำงานเป็นภาษาซี จึงมีความเร็วสูงเช่นกัน
และยังเขียนง่ายกว่าในภาษาซี
นอกจากนี้ numpy มักใช้คู่กับ matplotlib ซึ่งเป็นมอดูลสำหรับใช้เพื่อแสดงผลภาพ ฟังก์ชันใน opencv เองก็เช่นกัน
มีหลายอย่างที่ใช้งานร่วมกับ matplotlib ได้ดี บางอย่างก็ใช้ matplotlib ทำแทนแล้วสะดวกกว่าใช้อย่างอื่น
โดยเฉพาะเรื่องของตัว GUI และการแสดงผลภาพ
ดังนั้นความเข้าใจเกี่ยวกับ numpy และ matplotlib จึงจำเป็นสำหรับการใช้ opencv ในไพธอน
ที่จริงแล้วตัว opencv เองก็มี GUI สำหรับแสดงรูปภาพ แต่ว่าใช้ของ matplotlib แทนก็ได้เช่นกัน และใช้ง่ายกว่าด้วย
ดังนั้นจะไม่เขียนถึงเรื่องการใช้ GUI ของ opencv แต่จะทำด้วย matplotlib ทั้งหมด จุดประสงค์หลักที่ต้องการใช้ opencv
ก็คือความสามารถในการจัดการกับรูปภาพและวีดีโอ
บทเรียน numpy และ matplotlib ได้เขียนเอาไว้ใน
https://phyblas.hinaboshi.com/saraban/numpy_matplotlib
อย่างน้อยควรอ่านไปจนถึง
บทที่ ๖
เพราะเป็นพื้นฐานที่จำเป็น และ
บทที่ ๗ ถึง
บทที่ ๑๐ เองก็ใช้เยอะ สำคัญเช่นกัน
นอกจากนี้บทที่มีความเกี่ยวข้องอื่นๆอีกยังได้แก่
บทที่
๓๖ และ
๔๐ ด้วย ส่วน
บทที่ ๑๗,
บทที่ ๒๓ และ
บทที่ ๒๔ เองก็ถือว่าค่อนข้างสำคัญ
ในส่วนที่เขียนถึงเนื้อหา opencv-python นี้ก็จะมีการใช้ฟังก์ชันใน numpy และ matplotlib อยู่ตลอด
แต่จะไม่มีการอธิบายละเอียด เพราะส่วนใหญ่จะเขียนเอาไว้ในเนื้อหา numpy matplotlib เบื้องต้น
แต่ตรงไหนที่สำคัญอาจเขียนอธิบายเน้น หรือแปะลิงก์ของบทที่เนื้อหาเกี่ยวข้องไว้ให้อ่านเพิ่มเติม
การติดตั้งและใช้งาน
opencv-python เป็นมอดูลหนึ่งของไพธอน สามารถติดตั้งลงได้ง่ายโดยใช้ pip เหมือนมอดูลอื่นๆส่วนใหญ่
pip install opencv-python
สำหรับการเรียกใช้ opencv ในไพธอนนั้น แม้ว่าจะชื่อมอดูลว่า opencv-python แต่ตอนเรียกใช้จะใช้ในชื่อ cv2
import cv2
ฟังก์ชันทั้งหมดของ opencv-python ไม่ได้แบ่งเป็นมอดูลย่อยๆ ดังนั้นแค่ import cv2 ก็ใช้งานฟังก์ชันทั้งหมดได้
ไม่จำเป็นต้อง import แยกเป็นส่วนๆ
ทั้งฟังก์ชันและตัวแปรต่างๆใน cv2 นั้นมีมากมายเป็นพันๆ อาจลองดูชื่อฟังก์ชันทั้งหมดดูได้โดย
print(dir(cv2))
เวอร์ชันของไพธอนและเวอร์ชันของ opencv ที่ใช้งานก็อาจมีผลให้เกิดความแตกต่างอยู่ไม่น้อย
หากติดตั้งด้วย pip โดยไม่ได้กำหนดอะไรมักจะได้เวอร์ชันล่าสุด
หากอยากรู้ว่า opencv ที่ลงไว้เป็นเวอร์ชันเท่าไหร่อาจดูได้จาก
print(cv2.__version__)
ตัวอย่างในนี้จะใช้เวอร์ชัน 4.2 เป็นหลัก ส่วนตัวไพธอนใช้ไพธอน 3.7
(แต่อาจมีการแก้ถ้ามีการเปลี่ยนแปลงเกิดขึ้นในเวอร์ชันใหม่)
ทิ้งท้ายบท
ในบทนี้ได้แนะนำความรู้เบื้องต้นเกี่ยวกับ opencv และการนำ opencv มาใช้ในไพธอน รวมทั้งความสามารถโดยรวมไปแล้ว
บทต่อไปจะเริ่มแสดงตัวอย่างการเขียนโปรแกรม
เนื้อหาจะเริ่มจากพื้นฐานทั่วไปที่ควรจะรู้เกี่ยวกับ opencv จากนั้นก็เข้าสู่เทคนิคการตัดแต่งภาพในระดับที่ลึกลงไป
การค้นหาเค้าโครง แล้วก็การวิเคราะห์ค้นหาส่วนประกอบภายในภาพ แล้วก็ไปสู่เรื่องการจัดการวีดีโอและภาพเคลื่อนไหว
(นอกเรื่อง) อนึ่ง ภาพตัวอย่างที่ใช้ในบทเรียนนี้ส่วนใหญ่สร้างจาก
โปรแกรมมายาโดยใช้แบบจำลองจาก MMD
อ่านบทถัดไป >>
บทที่ ๒