φυβλαςのβλογ
บล็อกของ phyblas



opencv-python เบื้องต้น บทที่ ๑: บทนำ
เขียนเมื่อ 2020/06/28 18:18
แก้ไขล่าสุด 2024/02/22 10:27

ในบทความนี้จะเขียนถึงวิธีการใช้มอดูล 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





อ่านบทถัดไป >> บทที่ ๒



-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> opencv
-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文