วันพฤหัสบดีที่ 28 เมษายน พ.ศ. 2559

ทำความรู้จักกับโปรแกรมเซนเซอร์วิดีโออัตโนมัติ

สวัสดีค่ะคุณผู้อ่านทุกท่าน ตามชื่อหัวข้อก็คงทำให้พอเดาได้คร่าวๆว่าบทความนี้ได้กล่าวถึงโปรแกรมเซนเซอร์ภาพที่ทำงานได้อัติโนมัติ สำหรับโปรแกรมนี้เป็นการประมวลผลวิดีโอเพื่อให้ได้การติดตามการเคลื่อนไหวพร้อมการเซ็นเซอร์ภาพภายในวิดีโอ ซึ่งจุดประสงค์ของการพัฒนาโปรแกรม คือ
  1. เพื่อค้นหาทุกตำแหน่งของภาพที่ต้องการในวิดีโอได้
  2. เพื่อเซ็นเซอร์ภาพในวิดีโอได้ครบตรงตามที่กำหนด
  3. เพื่อเซ็นเซอร์วิดีโอให้แสดงผลออกมาอัตโนมัติ
  4. เพื่อแทนภาพอื่นในการเซนเซอร์
  5. เพื่อลดขั้นตอนการทำงานในการเซนเซอร์ภาพ
ในการใช้งานโปรแกรมจะต้องมี ข้อมูลนำเข้า (input) คือ
  1. รูปภาพตัวอย่างที่จะนำมาค้นหาในไฟล์วิดีโอ
  2. ไฟล์วิดีโอที่นำมาใช้งาน
  3. ภาพที่นำมาแทนการเซนเซอร์
และ ผลลัพท์ (output) ที่ได้ คือไฟล์วิดีโอที่สามารถเซนเซอร์วัตถุจากภาพตัวอย่าง ดังนั้นเราจะอธิบายรายละเอียดต่างๆที่ประกอบอยู่ในโปรแกรม ดังต่อไปนี้


                                       
คลิป A  เป็นตัวอย่างวิดีโอ Input ก่อนประมวลผล



คลิป B  เป็นตัวอย่างวิดีโอ Output หลังประมวลผล



ภาพ C เป็นภาพตัวอย่าง ที่ต้องการเซนเซอร์ในวิดีโอ


ในส่วนผลลัพธ์ที่ออกมานั้น อาจจะมีบางช่วงที่ผลลัพธ์ไม่เป็นที่ต้องการ หรือมีข้อผิดพลาดบางอย่างเนื่องจากมีหลายปัจจัยที่ส่งผล เช่น ฟังก์ชั่นการค้นหาภาพ ลักษณะของภาพที่เหมาะสม เป็นต้น
โปรแกรมทำงานอย่างไร ?  ใช้ฟังก์ชั่นใดบ้างในการทำงาน ?  เราจะอธิบายในตอนต่อไป


OpenCV คืออะไร ?


ก่อนอื่นเรามาทำความรู้จักกับ OpenCV กันก่อนนะคะ  โปรแกรม OpenCV เป็น Library ในภาษา C++ และ Phyton สำหรับการพัฒนาโปรแกรมที่เกี่ยวข้องกับ Image Processing และ Computer Vision โดยสามารถพัฒนาได้ทั้งในระบบปฏิบัติการวินโดว์ และระบบปฏิบัติการ Linux

วิธีใช้งาน OpenCV ร่วมกับโปรแกรม Visual Studio C++ เพื่อใช้พัฒนาโปรแกรมนั้น เราจำเป็นต้องตั้งค่าให้กับโปรแกรม Visual Studio C++ ก่อน เพื่อระบุตำแหน่งของ Library ของ OpenCV ตำแหน่งของไฟล์ที่ต้องใช้ในโปรแกรม และตำแหน่งของ Source File ให้ตัวโปรแกรมทราบ และสามารถดึงมาใช้ได้

สำหรับ OpenCV ในส่วนของ Corlor หรือ Object จะประกอบไปด้วย Histrogram ของสีต่างๆ เราจะเก็บลักษณะของ histrogram เอาไว้เช็คข้อมูลที่อยู่ในภาพ ที่เปลี่ยนแปลงอยู่ตลอดเวลาหากมีลักษณะที่ใกล้เคียงกันก็สามารถที่จะระบุตำแหน่งของ object หรือ corlor ได้

ข้อมูลจาก https://sourceforge.net/projects/opencvlibrary/?source=directory



ฟังก์ชันที่ใช้ในการทำงานและขั้นตอนวิธีของโปรแกรมนี้

1. Image Matching หรือการจับคู่ภาพ

ภาพ D แสดวถึงการจับคู่ภาพระหว่าง Source image และ Template image

ซึ่งในปัจจุบันมีวิธีการทำงานที่หลากหลาย โดยโปรแกรมนี้เลือกใช้ matchTemplate คือการทำงานที่ใช้การจับคู่กันของภาพสองภาพ ซึ่งเรียกว่า Source image (I) และ Template image (T) โดย I คือภาพต้นแบบที่เราต้องการนำมาจับคู่กับ T ซึ่ง T คือภาพตัวอย่างที่เราต้องการค้นหา เพื่อให้เข้าใจมากขึ้นสามารถดูที่ภาพประกอบ D

ข้อมูลจาก http://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

2.  Region of Interesting คือการกำหนดขอบเขตของภาพที่เราสนใจ โดยใช้ฟังก์ชันที่ชื่อว่า rect      ข้อมูลจาก http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html


3.  Motion Tracking หรือการติดตามการเคลื่อนไหว

ภาพ E เป็นการทำงานร่วมกันของฟังก์ชัน GoodFeaturesToTrack  และ calcOpticalFlowPyrLK

ซึ่งการติดตามการเคลื่อนไหวนี้มีหลากหลายวิธีการและมีความยืดหยุ่นในการเลือกใช้ แต่วิธีการที่เราเลือกใช้ในโปรแกรมนี้จะเป็นการทำงานร่วมกันของฟังก์ชัน GoodFeaturesToTrack  และ calcOpticalFlowPyrLK โดยขั้นแรก GoodFeaturesToTrack จะทำหน้าที่กำหนดจุดของวัตถุที่เราต้องการทำการติดตาม แล้วจึงใช้ calcOpticalFlowPyrLK เพื่อคำนวณหาการเคลื่อนที่ของวัตถุเพื่อทำการติดตาม

ข้อมูลจาก http://docs.opencv.org/2.4/modules/video/doc/motion_analysis_and_object_tracking.html


4.  Censor หรือเซนเซอร์

ภาพ F แสดงการเปรียบเทียบภาพต้นแบบและภาพที่ผ่านการใช้ GaussianBlur

ซึ่งในโปรแกรมนี้ใช้เซนเซอร์ที่ชื่อว่า GaussianBlur โดยใช้ในการปิดส่วนที่ไม่ต้องการในภาพตัวอย่าง เช่น โลโก้แบรนด์สินค้า เป็นต้น
ข้อมูลจาก  http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html


ในส่วนต่อไปจะเป็นการอธิบายการทำงานโปรแกรม  คลิ๊กที่นี่

Next การทำงานส่วนต่างๆ ของโปรแกรม เซนเซอร์วิดีโออัตโนมัติ

วันพุธที่ 27 เมษายน พ.ศ. 2559

การทำงานส่วนต่างๆ ของโปรแกรม เซนเซอร์วิดีโออัตโนมัติ

ในส่วนนี้ผู้เขียนจะขออธิบายส่วนหลักต่างๆที่ใช้งานภายในโปรแกรม โดยจะอธิบายในแต่ละส่วนของ     ฟังก์ชั่น และ การทำงานร่วมกันระหว่างฟังก์ชั่น

ในส่วนของ โค๊ดทั้งหมด



ส่วนผลลัพธ์จากข้างต้น


ภาพ G แสดงส่วนการทำงานต่างๆ ในโปรแกรม

ส่วนที่ 1 ส่วนรับค่าข้อมูล ( Input ) เช่นรับชื่อไฟล์ภาพ ไฟล์วิดีโอและภาพที่ต้องการนำมาแทนเซนเซอร์
              ส่วนแสดงผล  ( Output ) เช่น แสดงตำแหน่งที่ยกเลิกการเซนเซอร์ออก เฟรมที่บันทึกปัจจุบัน
ส่วนที่ 2 แสดงภาพตัวอย่างที่รับมา
ส่วนที่ 3 แสดงวิดีโอที่นำมาใช้งานอยู่
ส่วนที่ 4 แสดงแท็กบาร์ ที่ใช้ในการควบคุมการทำงาน ได้แก่
              - threshold     เป็นส่วนที่ไว้สำหรับปรับความแม่นยำในการจับภาพเซนเซอร์
              - Next Frame เป็นส่วนที่ ค้นหาช่วงวิดีโอถัดไป (เป็นวินาที)
              - Previous      เป็นส่วนที่ ค้นหาช่วงวิดีโอก่อนหน้านี้ (เป็นวินาที)
              - Shift-->       เป็นส่วนที่ ค้นหาช่วงวิดีโอถัดไป (เป็นเฟรม)
              - Shift<--       เป็นส่วนที่ ค้นหาช่วงวิดีโอก่อนหน้านี้ (เป็นเฟรม)


ในส่วนของฟังค์ชั่นหลักในตัวโปรแกรม คือส่วนหลักที่คอยทำงานหลักให้สำเร็จได้ ฟังก์ชั่นที่ใช้ได้แก่

1. Mat::imread (const string& filename, int flags=1)
                    คือ ฟังก์ชันที่ใช้งานในการอ่านไฟล์รูปจากข้อมูลในคอมพิวเตอร์เก็บใส่ตัวแปร    ประเภท Mat โดย Filename คือ path ไฟล์ของรูปนั้น Flags คือ กำหนดรูปที่โหลดมาจะ ให้เก็บรูปเป็นประเภทอะไร ในระบบงานนี้ได้ใช้ CV_LOAD_IMAGE_UNCHANGED นั่นคือ   ไม่มีการเปลี่ยนแปลงใดอาจใช้เลข 1 ก็ได้เช่นกัน

2. VideoCapture::VideoCapture (const string& filename)
                    คือ ฟังก์ชันที่ใช้งานในการอ่านไฟล์วิดีโอจากข้อมูลในคอมพิวเตอร์เก็บใส่ตัวแปร  ประเภท VideoCapture โดย Filename คือ path ไฟล์ของวิดีโอนั้น

3. VideoCapture::read (Mat& Image)
                    เป็นฟังก์ชันเฉพาะของตัวแปลประเภท VideoCapture ใช้ในการอ่านเฟรมวิดีโอ เก็บใส่ตัวแปลประเภทรูปภาพ Image คือ ตัวแปลประเภท Mat ไว้เก็บรูปแต่ละเฟรม

4. cvtColor (InputArray src, OutputArray dst, int code, int dstCn=0 )
                    คือฟังก์ชันที่ใช้เพื่อแปลงภาพสีประเภทหนึ่งเป็นอีกประเภทหนึ่ง โดยในระบบได้ใช้        ฟังก์ชันนี้ในการแปลงภาพสี 3 มิติ (BGR น้ำเงิน,เขียว,แดง) เป็นภาพสี 1 มิติ (สีขาว-ดำ)      เพื่อให้ง่ายต่อการคำนวณในการใช้งานฟังก์ชันถัดไป

5. Mat::create (int rows, int cols, int type)
                    ฟังก์ชันเฉพาะของตัวแปรประเภท Mat ใช้ในการสร้างรูปว่างๆ มา 1 รูป

6. matchTemplate (InputArray image, InputArray templ, OutputArray  result, int method)    
                    ฟังก์ชันที่ใช้ในการคำนวณเปรียบเทียบรูป 2รูป โดยรูปแรกเป็นรูปที่ต้องค้นหาในวิดีโอ รูปที่สองเป็นรูปภาพตัวอย่างเมื่อนำรูปทั้งสองมาคำนวณได้ผลลัพธ์เก็บค่านั้นลงในรูปผลลัพธ์ในแต่ละตำแหน่งที่ค้นหา
         
        Image  เป็นตัวแปร Mat ที่ต้องการค้นหาข้างในรูป (ในระบบนี้ใช้เป็นรูปในเฟรมวิดีโอ)
        Templ เป็นตัวแปร Mat เป็นรูปตัวอย่างที่จะนำมาค้นหา
        Result  เป็นตัวแปร Mat รับค่า มาเป็นรูปผลลัพธ์ที่มาจากการคำนวณของภาพทั้งสอง
       Method คือ สูตรที่ใช้ในการคำนวณการจับคู่ภาพในระบบนี้ใช้สูตร CV_TM_   CCOEFF_NORMED ในการคำนวณ

                                         
        ภาพ H แสดงการทำงานของฟังก์ชัน matchTemplate ในการจับคู่ภาพ

7. threshold (InputArray src, OutputArray dst, double thresh, double maxval, int type)
        เป็นฟังก์ชันกำหนดขอบเขตของค่าสีเพื่อตัดช่วงค่าสีที่ไม่ต้องการออกไป ในระบบนี้ ใช้ในการหาตำแหน่งภาพที่เหมือนกันให้มีความถูกต้องมากขึ้น
          Src      คือ ตัวแปร Mat ภาพที่รับเข้า
          Dst      คือ ตัวแปร Mat ภาพที่แสดงผลออกมา
          Thresh คือ ค่าthreshold ที่กำหนดขอบเขต
          Maxval คือ กรณีที่ใช้ threshold ประเภท binary กำค่าสูงสุด ( ในระบบนี้เป็น 0 )
          Type    คือ ประเภท Threshold ที่จะใช้ในการค้นหา (ในระบบนี้ใช้ CV_THRESH_TOZERO)

         
8. minMaxLoc (InputArray src, double*minVal, double*maxVal=0,Point*minLoc=0, Point*maxLoc=0)
          เป็นฟังก์ชันที่ใช้ในการหาค่าสีที่สูงสุด-ต่ำสุดของภาพพร้อมทั้งหาค่าตำแหน่งนั้นให้   (ในระบบนี้ใช้ในการหาค่าในภาพผลลัพธ์)
           Src                ตัวแปร Mat ภาพที่รับเข้า
           minVal           ค่าต่ำสุดที่หาได้ในภาพ
           maxVal          ค่าสูงสุดที่หาได้ในภาพ
           minLoc          ตำแหน่งภาพที่มีค่าต่ำสุด
           maxLoc         ตำแหน่งภาพที่มีค่าสูงสุด


                                 
             ภาพ I แสดงการบอกตำแหน่งของภาพด้วยฟังก์ชัน minMaxLoc ร่วมกับ matchTemplate

9. floodFill (InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar())
                   เป็นฟังก์ชันที่ใช้สำหรับเติมค่าสีใหม่ลงในสีเก่า ลงในพื้นที่ที่มีสีเหมือนกัน (ในระบบนี้ใช้เพื่อกำจัดตำแหน่งที่พบแล้ว)
          Image            ตัวแปรประเภท Mat ภาพรับเข้า
          seedPoint       ตำแหน่งที่เริ่มแทนที่สี
          newVal          สีใหม่ที่จะนำมาแทน
          rect                ในระบบไม่ได้ถูกใช้งาน มีค่าเป็น 0
          loDiff            ในระบบไม่ได้ถูกใช้งาน มีค่า Scalar เป็น 1
          upDiff           ในระบบไม่ได้ถูกใช้งาน มีค่า Scalar เป็น 1

10. Mat::Mat (Rect(int x,int y,int width,int hight))  Region of interest (ROI)
            Region of interest (ROI) คือ บริเวณที่เราสนใจซึ่งอาจจะเป็นบริเวณใดภาพในภาพก็ได้ โดยการตีกรอบล้อมรอบบริเวณที่สนใจด้วยวงกลม กรอบสี่เหลี่ยม หรือกรอบรูปเหลี่ยมใดๆ เพื่อนำภาพเฉพาะส่วนดังกล่าวมาประมวลผลหรือเปลี่ยนแปลงภาพตามต้องการ โดยไม่มีผลกระทบกับส่วนอื่นๆ ซึ่งภายในหนึ่งภาพสามารถกำหนดได้หลายๆบริเวณที่สนใจ การตัดเฉพาะส่วนของภาพ เพื่อนำมาประมวลผลทำให้การประมวลผลภาพเร็วขึ้นเนื่องจาก Resolution ของภาพที่นำมาประมวลผลมีขนาดเล็กลง ซึ่งในการประมวลผลภาพขนาดใหญ่จะทำให้เห็นความแตกต่างของประสิทธิภาพในการประมวลผลมาก
             เป็นฟังก์ชันเพื่อกำหนดขอบเขตในภาพที่เราสนใจ ซึ่งการแก้ไขอะไรบางอย่างใน ภาพที่กำหนดจะมีผลต่อภาพหลักด้วย
          x                  กำหนดตำแหน่ง ในแกน x
          y                  กำหนดตำแหน่ง ในแกน y
          width           กำหนดความกว้าง
          hight            กำหนดความสูง

11. GaussianBlur (InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0)
                        เป็นฟังก์ชันใช้ในการเบลอภาพ
          Src                ตัวแปร Mat รับภาพเข้า
          Dst                ตัวแปร Mat ภาพหลังจากประมวลผล
          Ksize             เป็นค่ากำหนดความเบลอ
          sigmaX          ในระบบไม่ได้ใช้งานมีค่าเป็น 0
          sigmaY          ในระบบไม่ได้ใช้งานมีค่าเป็น 0

12. goodFeaturesToTrack (InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance)
                    เป็นฟังก์ชันที่ใช้กำหนด feature (มุมของภาพ) ที่เหมาะสม
          Image             ตัวแปร Mat ภาพที่รับเข้า
          Corners           เป็น vecter array ที่เก็บตำแหน่งของมุมในภาพที่เจอ
          maxCorners    กำหนดจำนวนที่มากที่สุดที่หามุมเจอได้
          qualityLevel    กำหนดระดับความละเอียดของมุมที่เจอ
          minDistance    ระยะทาง Euclidean ที่น้อยที่สุดที่เป็นไปได้ในมุมกลับ

13. calcOpticalFlowPyrLK(InputArray prevImg, InputArray nextImg, InputArray prevPts, InputOutputArray nextPts)

                   เป็นฟังก์ชันที่ใช้ในการค้นหาตำแหน่งวัตถุถัดไปของเฟรมวิดีโอที่เหมาะสม
          prevImg         ภาพจากเฟรมวิดีโอก่อนหน้า
          nextImg         ภาพเฟรมวิดีโอถัดไป หรือเฟรมปัจจุบัน
          prevPts           ตำแหน่ง feature ที่กำหนดไว้ในเฟรมก่อนหน้านี้
          nextPts             ตำแหน่ง feature ของเฟรมถัดไป หรือเฟรมปัจจุบัน

       

ในส่วนฟังก์ชันเสริม เป็นฟังก์ชันที่ช่วยในการใช้งานของระบบให้สามารถใช้งานได้ง่ายขึ้น หรือเพื่อใช้ในการทำงานบางอย่างของระบบที่ฟังก์ชันหลักไม่สามารถทำได้ ฟังก์ชั่นที่ใช้ได้แก่

14. VideoWriter::VideoWriter (string& filename, int fourcc, double fps, Size frameSize, bool isColor=true)
              ฟังก์ชันที่ไว้ใช้ในการบันทึกไฟล์วิดีโอหลังจากการทำงานโดยนามสกุลไฟล์ที่บันทึกเป็น .avi
            Filename        กำหนด path ไฟล์ และชื่อไฟล์ที่ต้องการจะบันทึก
       Fourcc      เป็นตัวกำหนด code ว่าจะเลือกรูปแบบการอัดเป็นแบบไหน (ในระบบนี้ ผู้ใช้เลือก CV_FOURCC('P', 'I', 'M', '1'))
            Fps                 อัตราส่วนเฟรมต่อวินาที ที่ต้องการบันทึก ลงไปในวิดีโอ
            frameSize       ขนาดเฟรมวิดีโอที่ต้องการบันทึก
            isColor           กำหนดการบันทึกเป็นเฟรมสี หรือขาวดำ   

15. setMouseCallback (string& winname, MouseCallback onMouse, void*userdata=0)
              ฟังก์ชันตัวกำหนดในการใช้งานเมาส์ เพื่อให้ผู้ใช้งานใช้งานในระบบง่ายขึ้น
        Winname   ชื่อของ windows (หน้าต่างแสดงผล) ที่ต้องการควบคุม
        onMouse   method ที่กำหนดการใช้งานของเมาส์
      userdata    กำหนดตัวแปรที่ต้องการเปลี่ยนแปลงค่าตามการใช้งานของเมาส์หากไม่ใช้งานให้เป็น 0
      
16.  VideoCapture::get (int propId)
              เป็นฟังก์ชันเฉพาะของตัวแปลประเภท VideoCapture ใช้ในการรับข้อมูลบางอย่างจากวิดีโอ
         propId code ที่กำหนดสิ่งต้องการรับข้อมูลจากวิดีโอ
        (ในระบบนี้ผู้ใช้เลือก CV_CAP_PROP_POS_FRAMES ในการรับตำแหน่งเฟรมปัจจุบัน)

17.  bool VideoCapture::set (int propId, double value)
            เป็นฟังก์ชันเฉพาะของตัวแปลประเภท VideoCapture ใช้ในการกำหนดบางอย่างในวิดีโอ
   propId code ที่กำหนดสิ่งต้องการกำหนดในวิดีโอ (ในระบบนี้ผู้ใช้เลือก           CV_CAP_PROP_POS_FRAMES คือการกำหนด ตำแหน่งเฟรมใหม่ที่ต้องการอ่าน)
          value ค่าที่เราต้องการกำหนดบางอย่างในวิดีโอ

18.  waitKey (int delay=0)
          เป็นฟังก์ชันหน่วงเวลาเพื่อรับข้อมูลจากคีย์บอร์ด หรืออาจจะใช้เพื่อหน่วงเวลาอย่างเดียวก็ได้
            Delay กำหนดเวลาที่หน่วงหน่วยเป็น milliseconds

19. createTrackbar (string& trackbarname, string& winname, int*value,  int count)
          เป็นฟังก์ชันสร้างแทร็กบาร์ขึ้นมาเพื่อใช้กำหนดค่าบางอย่างในการทำงาน
          Trackbarname กำหนดชื่อแทร็กบาร์
          Winname       ชื่อของ windows (หน้าต่างแสดงผล) ที่จะนำมาแสดงแทร็กบาร์
          Value           ตัวแปรที่ต้องการเปลี่ยนแปลงตามค่าที่กำหนดในแทร็กบาร์
          Count           ขอบเขตค่าที่กำหนดได้ในแทร็กบาร์

20. rectangle (Mat& img, Point pt1, Point pt2, const Scalar& color, int  thickness=1)
          ฟังก์ชันที่ใช้ในการสร้างกรอบสี่เหลี่ยม
          Img               ตัวแปร Mat รูปที่ต้องการสร้าง สีเหลี่ยมไว้ข้างใน
          pt1               ตำแหน่งสีเหลี่ยม มุมบนซ้าย
          pt2               ตำแหน่งสีเหลี่ยม มุมล่างขวา
          color             ค่าสีของกรอบสี่เหลี่ยม
          thickness    ค่าความหนาของกรอบสี่เหลี่ยม

ข้อมูลจาก : http://docs.opencv.org/2.4/

สรุปผลลัพธ์
       ในสุดท้ายนี้ ผลลัพธ์ที่ออกมานั้นอาจไม่เป็นไปตามที่ต้องการทั้งหมด แต่สามารถใช้ส่วนจัดการด้วยตัวเอง( Manual ) ทำให้ผลลัพธ์ ออกมาตามที่ต้องการได้ ส่วนความเร็วในการประมวลผล การทำงานซึ่งจะขึ้นอยู่กับความสัมพันธ์ สองอย่างคือ ขนาดข้อมูลนำเข้า (ไฟล์ภาพตัวอย่าง ไฟล์วิดีโอ) กับความเร็วของเครื่องผู้ใช้งาน เป็นต้น
      ทั้งนี้ทั้งนั้นการทำโปรแกรมนี้ ( เซนเซอร์วิดีโออัตโนมัติ ) อาจจะมีวิธีการที่หลากหลาย ในการพัฒนาขึ้นมา ไม่ว่าจะเป็นฟังก์ชั่นการจับคู่ภาพ ฟังก์ชั่นติดตามวัตถุ หรือฟังก์ชั่นการเบลอ ซึ่งยังมีอีกหลากหลายที่ปัจจุบันมีให้ใช้ ผู้เขียนจึงหวังว่า บทความนี้จะเป็นประโยชน์แก่ผู้อ่าน ในการศึกษาต่อยอด ในวิชา Computer Vision

ขอขอบคุณผู้อ่านทุกท่าน


<< Previous ทำความรู้จักกับโปรแกรมเซนเซอร์ภาพอัตโนมัติ