ในส่วนนี้ผู้เขียนจะขออธิบายส่วนหลักต่างๆที่ใช้งานภายในโปรแกรม โดยจะอธิบายในแต่ละส่วนของ ฟังก์ชั่น และ การทำงานร่วมกันระหว่างฟังก์ชั่น
ในส่วนของ โค๊ดทั้งหมด
ส่วนผลลัพธ์จากข้างต้น
ภาพ 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 ทำความรู้จักกับโปรแกรมเซนเซอร์ภาพอัตโนมัติ