รูปปกบทความ

1. 🎯 ตอนที่ 2: สแกนโครงสร้าง OpenCV คลังอาวุธลับของนักพัฒนา Vision มีโมดูลอะไรให้ใช้บ้าง?

2. 📖 เปิดฉาก (The Hook)

น้องๆ เคยเดินเข้าห้างขายวัสดุก่อสร้างขนาดใหญ่ เพื่อไปซื้ออะไหล่มาประกอบหุ่นยนต์ไหมครับ? ถ้าเราไม่รู้ว่าแผนกไหนขายอะไร เราคงต้องเดินหลงวนไปมาเสียเวลาเป็นวันๆ การเขียนโปรแกรมด้วย OpenCV ก็เหมือนกันครับ! ด้วยความที่มันมีอัลกอริทึมที่ถูกปรับแต่งมาให้ใช้งานมากกว่า 2,500 รายการ ถ้าเราไม่รู้โครงสร้างของมัน เวลาเจอปัญหาหน้างานจริง (เช่น ต้องตรวจจับของหลุด QC บนสายพานที่วิ่งเร็วๆ) เราก็จะไม่รู้ว่าต้องวิ่งไปเรียกใช้คำสั่งจากส่วนไหน

ในฐานะวิศวกรสาย Vision รุ่นพี่ วันนี้ผมจะขอชงกาแฟสักแก้ว แล้วพาน้องๆ ไปกางแผนที่ดูโครงสร้างของ OpenCV ที่ถูกออกแบบมาในลักษณะ “Modular Architecture” (แบ่งเป็นโมดูลย่อยๆ) กันครับ ว่าในคลังอาวุธนี้มี “โมดูล” หลักอะไรบ้าง แต่ละส่วนมีหน้าที่อะไร และเราจะเรียกฮีโร่คนไหนมากู้สถานการณ์ในแต่ละโปรเจกต์!

3. 🧠 แก่นวิชา (Core Concepts)

OpenCV ถูกแบ่งออกเป็นไลบรารีย่อยๆ หลายโมดูล ซึ่งเราสามารถเลือกใช้งานเฉพาะส่วนที่จำเป็นได้ นี่คือ 5 โมดูลระดับพระกาฬที่คนทำ Machine Vision ต้องเจอแทบทุกวัน:

  • 1. core (หัวใจและโครงสร้างพื้นฐาน)
    • มันคืออะไร: โมดูลที่เก็บโครงสร้างข้อมูลพื้นฐานทั้งหมด เช่น ตัวแปรประเภท Mat (Matrix), Vec, Scalar รวมถึงฟังก์ชันการคำนวณทางคณิตศาสตร์ระดับล่าง และการจัดการหน่วยความจำ
    • เปรียบเทียบ: เหมือนเป็นโครงกระดูกและระบบสูบฉีดเลือดของ OpenCV ภาพทุกภาพจะต้องถูกเก็บในรูปแบบ Mat ซึ่งเปรียบเสมือนตาราง Excel ขนาดยักษ์ที่เก็บค่าสีของแต่ละพิกเซลเอาไว้
    • สถานการณ์ใช้งาน: ทุกครั้งที่คุณโหลดภาพเข้ามาเก็บไว้ในตัวแปร หรือต้องการคูณ/บวก ค่า Matrix ของภาพ คุณกำลังใช้งานโมดูลนี้อยู่ครับ
  • 2. imgproc (โรงงานตกแต่งภาพ - Image Processing)
    • มันคืออะไร: รวมอัลกอริทึมการประมวลผลภาพ (Image Processing) เช่น การกรองภาพ (Filtering), แปลงปริภูมิสี (Color Space Conversion), การหาขอบ (Edge Detection), Morphological Operations และทำ Histograms
    • เปรียบเทียบ: เหมือนเรามีเครื่องยนต์ของโปรแกรม Photoshop อยู่ในมือ
    • สถานการณ์ใช้งาน: เมื่อภาพจากกล้องในโรงงานมืดเกินไป หรือมี Noise เยอะ เราจะใช้โมดูลนี้แปลงภาพเป็น Grayscale, ทำ Thresholding หรือใส่ Gaussian Blur เพื่อปรับภาพให้เคลียร์ก่อนส่งให้ AI วิเคราะห์
  • 3. highgui (หน้าต่างสื่อสารกับมนุษย์ - High-level GUI)
    • มันคืออะไร: อินเทอร์เฟซระดับสูงสำหรับสร้างหน้าต่างโปรแกรม (Window), รับค่าจากการคลิกเมาส์ (Mouse Events), กดคีย์บอร์ด, หรือสร้างแถบเลื่อน (Trackbars)
    • เปรียบเทียบ: หน้าปัดและปุ่มควบคุมบนแผงคอนโซลของหุ่นยนต์
    • สถานการณ์ใช้งาน: เวลาเราอยากทดสอบอัลกอริทึม Vision App เร็วๆ เราจะใช้ highgui สร้างหน้าต่างโชว์ภาพ (imshow) และทำ Trackbar ให้ผู้ใช้เลื่อนปรับค่าความสว่างได้แบบ Real-time
  • 4. video (นักจับสังเกตการเคลื่อนไหว - Video Analysis)
    • มันคืออะไร: โมดูลสำหรับการวิเคราะห์วิดีโอโดยเฉพาะ เช่น การประมาณทิศทางการเคลื่อนที่ด้วย Optical Flow, การแยกพื้นหลัง (Background Subtraction) และการติดตามวัตถุ (Object Tracking)
    • สถานการณ์ใช้งาน: สมมติว่าเราทำระบบกล้องวงจรปิด (Surveillance) แล้วต้องการตรวจจับคนเดินบุกรุกเข้ามาในโซนหวงห้าม เราจะใช้ Background Subtraction จากโมดูลนี้เพื่อดึงเฉพาะสิ่งที่เคลื่อนไหวออกมาจากภาพพื้นหลังที่อยู่นิ่งๆ
  • 5. dnn (สมองกลอัจฉริยะ - Deep Neural Network)
    • มันคืออะไร: โมดูลที่ใช้สำหรับรันโมเดล Deep Learning (Forward Pass / Inference) สามารถโหลดโมเดลที่เทรนเสร็จแล้วจากเฟรมเวิร์กดังๆ อย่าง TensorFlow, Caffe, Torch, Darknet (YOLO) หรือฟอร์แมต ONNX มาใช้งานได้ทันที
    • สถานการณ์ใช้งาน: เมื่อ Rule-based Vision ธรรมดาเอาไม่อยู่ เช่น ต้องทำ Face Detection แบบแม่นยำสูง หรือรันโมเดล YOLO เพื่อตรวจจับหมวกนิรภัยของพนักงาน เราจะโหลดไฟล์โมเดล (เช่น .pb หรือ .weights) เข้ามาผ่านโมดูล dnn เพื่อทำการทำนายผลครับ
รูปประกอบ

4. 💻 ร่ายมนต์คำสั่ง (Show me the Code)

ลองมาดูโค้ด C++ ที่แสดงให้เห็นว่า “โมดูลต่างๆ” มันทำงานร่วมกันอย่างกลมกลืนใน Pipeline เดียวได้อย่างไรครับ (สังเกตที่การ #include นะครับ)

#include <opencv2/core.hpp>     // เรียกใช้โมดูล core สำหรับ cv::Mat
#include <opencv2/imgproc.hpp>  // เรียกใช้โมดูล imgproc สำหรับ cvtColor, GaussianBlur
#include <opencv2/highgui.hpp>  // เรียกใช้โมดูล highgui สำหรับ namedWindow, imshow
#include <opencv2/videoio.hpp>  // เรียกใช้โมดูล videoio (หรือ highgui ในเวอร์ชันเก่า) สำหรับดึงภาพวิดีโอ
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // 1. (videoio) สร้างอ็อบเจ็กต์เชื่อมต่อกับกล้อง Webcam ตัวแรก (Index 0)
    VideoCapture cap(0); 
    if(!cap.isOpened()) return -1;

    // 2. (core) สร้างตัวแปร Mat เก็บภาพต้นฉบับและภาพที่ผ่านการแต่งแล้ว
    Mat frame, edges; 
    
    // 3. (highgui) สร้างหน้าต่างสำหรับแสดงผล
    namedWindow("Edge Detection", WINDOW_NORMAL); 

    for(;;) {
        // ดึงภาพทีละเฟรมจากกล้องเข้ามาใส่ในตัวแปร frame
        cap >> frame; 
        
        // 4. (imgproc) เปลี่ยนภาพสี BGR เป็น Grayscale (ขาวดำ)
        cvtColor(frame, edges, COLOR_BGR2GRAY); 
        
        // 5. (imgproc) ใส่ Filter เบลอภาพนิดหน่อยเพื่อลด Noise ก่อนหาขอบ
        GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); 
        
        // 6. (imgproc) ใช้เวทมนตร์ Canny Edge Detection ดึงเฉพาะเส้นขอบวัตถุออกมา
        Canny(edges, edges, 0, 30, 3); 
        
        // 7. (highgui) โชว์ภาพขอบที่ได้ลงบนหน้าต่าง
        imshow("Edge Detection", edges); 
        
        // (highgui) รอรับค่าคีย์บอร์ด 30 มิลลิวินาที ถ้ากดปุ่มไหนก็ตามให้ออกจาก Loop
        if(waitKey(30) >= 0) break; 
    }
    return 0;
}

5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)

  • DNN Module เป็นแค่คนลงมือทำ ไม่ใช่คนเรียนรู้: หลายคนเข้าใจผิดว่าเราสามารถเอารูปมารันสคริปต์สอน AI ใน OpenCV ได้ ต้องจำไว้ว่าโมดูล dnn ถูกออกแบบมาเพื่อทำ “Inference” (ประมวลผลไปข้างหน้า) เท่านั้น มันไม่รองรับการทำ Backward Propagation เพื่ออัปเดตน้ำหนักเครือข่ายสำหรับการเทรน เราต้องไปเทรนโมเดลใน TensorFlow หรือ PyTorch ให้เสร็จก่อน แล้วค่อยเอาไฟล์โมเดลมาเสียบใช้ใน OpenCV เพื่อรีดความเร็วตอนนำไปใช้จริงครับ
  • จัดกระเป๋าให้เบาเวลา Deployment: สถาปัตยกรรม Modular ของ OpenCV มีข้อดีมากเวลาเราเอาซอฟต์แวร์ไปลงบอร์ดฝังตัว (Embedded Systems) ที่เมมโมรีน้อยๆ เราสามารถเลือกนำไปใช้งานหรือคอมไพล์เฉพาะโมดูลที่เราต้องการ (เช่น แค่ core, imgproc และ videoio) ทำให้ตัวแอปพลิเคชันเราเบาหวิวและบำรุงรักษาได้ง่ายขึ้น

6. 🏁 บทสรุป (To be continued…)

เป็นยังไงบ้างครับ? พอเราสแกนดูโครงสร้างแบบนี้แล้ว การเรียนรู้ OpenCV ก็ดูไม่น่ากลัวอีกต่อไปใช่ไหมครับ แค่เราแบ่งปัญหาออกเป็นส่วนๆ (ดึงภาพ -> ตกแต่งภาพ -> วิเคราะห์/หาวัตถุ -> แสดงผล) เราก็จะรู้ว่าต้องวิ่งไปหยิบคำสั่งจากโมดูลไหนมาใช้

ในตอนต่อไป เราจะมาเจาะลึกที่แก่นกลางของทุกสิ่งนั่นคือโมดูล core และทำความรู้จักกับพระเอกตัวจริงอย่าง cv::Mat ว่ามันเก็บข้อมูลพิกเซลล้านๆ ตัวให้เราจัดการด้วยความเร็วแสงได้ยังไง รอติดตามกันนะครับ!


ต้องการที่ปรึกษาด้านการพัฒนาระบบ AI Camera หรือ Machine Vision ให้กับโรงงานของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและติดตั้งระบบแบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p