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

This image has an empty alt attribute; its file name is 48.jpg



คลิกที่โฟลเดอร์ 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 เพื่อทดสอบการทำงาน โปรแกรมแสดงภาพจากกล้องเว็บแคม เป็นภาพเคลื่อนไหว