OpenCV แสดงรูปภาพ, วิดีโอ และ กล้องเว็บแคม
@ ส่วนหัวของโปรแกรม
ส่วนหัวของโปรแกรม หรือที่เรียกว่า เฮดเดอร์ไฟล์ (Header File) เป็นการเรียกใช้เฮดเดอร์ไฟล์ จากไลบรารี่ OpenCV เข้ามาร่วมใช้งานภายในโปรแกรม โดยไฟล์เฮดเดอร์เป็นไฟล์ที่ใช้ในการรวบรวมฟังก์ชั่นการทำงานต่างๆ ของ OpenCV ที่ใช้ในโปรแกรมนี้คือ
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
และนำเข้าไลบรารี่มาตฐานของภาษา C++ ในตัวอย่างด้านล่างได้นำเข้าไลบรารี่ iostream ซึ่งจะประกอบไปด้วยฟังก์ชันการทำงานเกี่ยวกับ Input และ Output
#include <iostream>
ภาษา C++ ยังมีไลบรารี่มาตรฐานที่เรียกว่าเนมสเปซ (Namespace)
เพื่อเรียกใช้งานคลาส Mat ในไลบรารี่ของเนมสเปซ cv เราจำเป็นต้องใช้คำสั่ง using namespace cv
และเพื่อเรียกใช้งานคลาส string ในไลบรารี่ของเนมสเปซ std เราจำเป็นต้องใช้คำสั่ง using namespace std
using namespace cv;
using namespace std;
@ ส่วนฟังก์ชั่น
ส่วนฟังก์ชั่น ในที่นี้ ฟังก์ชั่นที่กำหนดขึ้นมาชื่อฟังก์ชั่น main() โดยทุกโปรแกรมจะต้องมีฟังก์ชัน main()
int main()
@ ส่วนตัวโปรแกรม
ส่วนตัวโปรแกรม ส่วนนี้เป็นส่วนในการเขียนคำสั่งต่างๆ เพื่อสั่งให้คอมพิวเตอร์ทำงาน ในการเขียน. คำสั่งจะเขียนภายในเครื่องหมายปีกกาเปิด และ เครื่องหมายปีกกาปิด
{
// ส่วนตัวโปรแกรม
}
ภายในของ ส่วนตัวโปรแกรม จะมี @ส่วนของการประกาศตัวแปร คือ ส่วนที่ใช้ในการกำหนดตัวแปรที่จะใช้งานในการเขียนโปรแกรม
1. ตัวแปร ชื่อ path ชนิดข้อมูลเป็น string เป็นคลาสใน C++ Library สืบทอดมาจาก เนมสเปซ std มีค่าเป็น “Resources/test.png”
2. ตัวแปร อินสแตนซ์ (instance) ชื่อ img สร้างจากคลาส Mat หรือ เมทริกซ์ เป็นคลาสใน OpenCV Library สืบทอดมาจาก เนมสเปซ cv และ imread คือ นำเข้าและอ่านไฟล์ที่ได้จากตัวแปร path
string path = "Resources/test.png";
Mat img = imread(path);
@ส่วนของคำสั่ง คือ ส่วนที่ใช้ในการสั่งให้โปรแกรมทำงานหรือแสดงผล
แสดงรูปภาพ ด้วยคำสั่ง imshow มาจาก I am show ด้วยชื่อออปเจ็ค Image และข้อมูลจากตัวแปร เมทริกซ์ ชื่อ img
imshow("Image", img);
ถ้าไม่มีคำสั่ง waitKey(0) นี้ เมื่อโปรแกรมทำงานรูปภาพจะแสดงและจะปิดลงทันที จึงมีคำสั่งนี้เพื่อรอจนกว่าเรากดคีย์ใดๆ รูปภาพจึงจะปิดลงไป
waitKey(0);
ส่งค่า 0 กลับไป หมายถึง โปรแกรมทำงานเสร็จสิ้นโดยสมบูรณ์แล้ว ไม่มี Error ใดๆ
return 0;
ขั้นตอนการทํางาน
# การใช้งาน OpenCV + Visual Studio 2019 ด้วย ภาษา C++
โดยศึกษา ขั้นตอนการทำงาน จากลิงค์บทความ ด้านล่าง
1 : OpenCV แสดงรูปภาพ
เขียนโค้ดดังนี้
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
string path = "Resources/test.png";
Mat img = imread(path);
imshow("Image", img);
waitKey(0);
return 0;
}
Save
เพิ่มไฟล์รูปภาพเข้าไปในโปรเจค
คลิกขวาที่ ชื่อโปรเจค -> Open Folder in File Explorer
สร้างโฟลเดอร์ใหม่ สำหรับเก็บรูปภาพ ชื่อ Resources
เพิ่มรูปภาพนี้เข้าไปในโปรเจค
คลิกขวา ที่รูปภาพด้านบน -> Save image as…
เลือกไปที่ โฟลเดอร์ สำหรับเก็บรูปภาพ ชื่อ Resources ที่สร้างก่อนหน้านี้ -> Save
ตรวจสอบการมีอยู่ของไฟล์รูปภาพ โดยคลิกไปที่ Show All Files
คลิกที่โฟลเดอร์ Resources จะพบไฟล์รูปภาพ test.png
คลิกที่ Show All Files เพื่อกลับสู่หน้าเดิม
คลิกที่ Local Windows Debugger เพื่อทดสอบการทำงาน
ถ้าไม่มีอะไรผิดพลาด โปรแกรม จะแสดงรูปภาพ
2 : OpenCV แสดงวิดีโอ mp4
#เตรียมไฟล์ วิดีโอ mp4 หรือ ดาวน์โหลดที่
คลิกที่ . ขวามือด้านล่าง -> Download
Copy ไปที่ โฟลเดอร์ Resources โปรเจค OpenCV
ตรวจสอบการมีอยู่ของไฟล์วิดีโอ โดยคลิกไปที่ Show All Files
คลิกที่โฟลเดอร์ Resources จะพบไฟล์วิดีโอ ชื่อ sample-mp4-file.mp4
@ ส่วนตัวโปรแกรม
ภายในของ ส่วนตัวโปรแกรม จะมี @ส่วนของการประกาศตัวแปร คือ ส่วนที่ใช้ในการกำหนดตัวแปรที่จะใช้งานในการเขียนโปรแกรม
1. ตัวแปร ชื่อ path ชนิดข้อมูลเป็น string เป็นคลาสใน C++ Library สืบทอดมาจาก เนมสเปซ std มีค่าเป็น “ Resources/sample-mp4-file.mp4″
string path = "Resources/sample-mp4-file.mp4";
2. ตัวแปร อินสแตนซ์ (instance) ชื่อ cap สร้างจากคลาส VideoCapture เป็นคลาสใน OpenCV Library สืบทอดมาจาก เนมสเปซ cv นำเข้าและอ่านไฟล์ วิดีโอ ที่ได้จากตัวแปร path
VideoCapture cap(path);
3. ตัวแปร อินสแตนซ์ (instance) ชื่อ img สร้างจากคลาส Mat หรือ เมทริกซ์ เป็นคลาสใน OpenCV Library สืบทอดมาจาก เนมสเปซ cv
Mat img;
@ส่วนของคำสั่ง คือ ส่วนที่ใช้ในการสั่งให้โปรแกรมทำงานหรือแสดงผล
การใช้ Loop while จะดูเงื่อนไขใน while โดยตรง ถ้าเกิดเข้าเงื่อนไขก็จะมีการวนลูปไปเรื่อยๆ
while (true)
{
}
โค้ดภายใน Loop while ตัวแปร img ชนิดข้อมูลเป็น Mat หรือ เมทริกซ์ รับค่าจากการอ่านไฟล์วิดีโอ มาเป็นไฟล์รูปภาพ ทีละภาพ จากคลาส VideoCapture ชื่อ cap
cap.read(img);
โค้ดภายใน Loop while แสดงรูปภาพ ด้วยคำสั่ง imshow มาจาก I am show ด้วยชื่อออปเจ็ค Image และข้อมูลจากตัวแปร เมทริกซ์ ชื่อ img โดย นำรูปภาพแต่ละ รูปภาพ มาแสดงต่อเนื่องกันเป็นภาพเคลื่อนไหว เหมือนไฟล์วิดีโอ
imshow("Image", img);
โค้ดภายใน Loop while คำสั่ง waitKey เป็นค่าความเร็วเล่นภาพวิดีโอ โดยถ้าค่ายิ่งน้อยจะทำให้เล่นภาพวิดีโอเร็วขึ้น
waitKey(20);
คลิกที่ Show All Files เพื่อกลับสู่หน้าเดิม แล้ว เขียนโค้ดดังนี้
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
string path = "Resources/sample-mp4-file.mp4";
VideoCapture cap(path);
Mat img;
while (true)
{
cap.read(img);
imshow("Image", img);
waitKey(20);
}
}
คลิกที่ Local Windows Debugger เพื่อทดสอบการทำงาน โปรแกรมจะเล่นไฟล์วิดีโอ และ ถ้าหมดเฟรมเล่นโปรแกรมจะ error จากการใช้ Loop while
3 : OpenCV เปิดกล้องเว็บแคม
@ ส่วนตัวโปรแกรม
ภายในของ ส่วนตัวโปรแกรม จะมี @ส่วนของการประกาศตัวแปร คือ ส่วนที่ใช้ในการกำหนดตัวแปรที่จะใช้งานในการเขียนโปรแกรม
1. ตัวแปร อินสแตนซ์ (instance) ชื่อ cap สร้างจากคลาส VideoCapture เป็นคลาสใน OpenCV Library สืบทอดมาจาก เนมสเปซ cv นำเข้าและอ่านไฟล์ วิดีโอ จากกล้องเว็บแคม โดยปรกติถ้ามี กล้องเว็บแคม 1 ตัว จะเซ็ตค่า id เป็น (0) แต่ถ้าจะใช้ กล้องเว็บแคม ตัวที่ 2 จะเซ็ตค่า id เป็น (1)
VideoCapture cap(0);
2. ตัวแปร อินสแตนซ์ (instance) ชื่อ img สร้างจากคลาส Mat หรือ เมทริกซ์ เป็นคลาสใน OpenCV Library สืบทอดมาจาก เนมสเปซ cv
Mat img;
@ส่วนของคำสั่ง คือ ส่วนที่ใช้ในการสั่งให้โปรแกรมทำงานหรือแสดงผล
การใช้ Loop while จะดูเงื่อนไขใน while โดยตรง ถ้าเกิดเข้าเงื่อนไขก็จะมีการวนลูปแสดงภาพจาก กล้องเว็บแคม โดยจะแสดงด้วยคำสั่ง imshow มาจาก I am show ด้วยชื่อออปเจ็ค Image และข้อมูลจากตัวแปร เมทริกซ์ ชื่อ img โดย นำรูปภาพแต่ละ รูปภาพ จากกล้องเว็บแคม มาแสดงต่อเนื่องกันเป็นภาพเคลื่อนไหว
while (true) {
cap.read(img);
imshow("Image", img);
waitKey(1);
}
เขียนโค้ดดังนี้
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
VideoCapture cap(0);
Mat img;
while (true) {
cap.read(img);
imshow("Image", img);
waitKey(1);
}
}
คลิกที่ Local Windows Debugger เพื่อทดสอบการทำงาน โปรแกรมแสดงภาพจากกล้องเว็บแคม เป็นภาพเคลื่อนไหว