การแปลงภาพแบบ Perspective OpenCV

การแปลงภาพแบบ Perspective คือ การฉายจุดลงบนฉากรับภาพตามแนวเส้นที่พุ่งออกมาจากจุดจุดหนึ่งที่เรียกว่า จุดศูนย์กลางการฉาย

ขั้นตอนการทํางาน


# แสดงรูปภาพ , วิดีโอ และ เว็บแคม


โดยศึกษา ขั้นตอนการทำงาน จากลิงค์บทความ ด้านล่าง



1 : เพิ่มไฟล์รูปภาพเข้าไปในโปรเจค



คลิกขวาที่ ชื่อโปรเจค -> Open Folder in File Explorer


เพิ่มรูปภาพนี้เข้าไปในโปรเจค

คลิกขวา ที่รูปภาพด้านบน -> Save image as…


เลือกไปที่ โฟลเดอร์ สำหรับเก็บรูปภาพ ชื่อ Resources ที่สร้างก่อนหน้านี้ -> Save


ตรวจสอบการมีอยู่ของไฟล์รูปภาพ โดยคลิกไปที่ Show All Files



คลิกที่โฟลเดอร์ Resources จะพบไฟล์รูปภาพ 1-6-1024×680.jpg แล้ว คลิกที่ Show All Files เพื่อกลับสู่หน้าเดิม


2. หาตำแหน่งพิกัดของรูปภาพ 4 จุด


เปิดโปรแกรม Paint


เปิดไฟล์ขึ้นมา


หาตำแหน่งพิกัดของรูปภาพ โดยการเลื่อนเมาส์ไปตำแหน่งที่ต้องการ ที่ด้านล่างมุมซาย จะแสดงค่า ตำแหน่งพิกัด มีค่าเป็นพิกเซล ของจุดนั้น และ เราจะนำค่านี้ไปเขียนโปรแกรม

ตัวอย่าง 1.{108,434}, 2.{246,362}, 3.{226,593}, 4.{372,511}


3. การแปลงภาพแบบ Perspective


การฉายจุดลงบนฉากรับภาพตามแนวเส้นที่พุ่งออกมาจากจุดจุดหนึ่งที่เรียกว่า จุดศูนย์กลางการฉาย

@คำสั่งที่เพิ่มเข้ามา


ประกาศตัวแปร ข้อมูลชนิดเลขทศนิยม float 2 ตัว โดย w มีค่า 250 และ h มีค่า 350

float w = 250, h = 350;


สร้างตัวแปร อินสแตนซ์ (instance) ชื่อ matrix และ imgWarp สร้างจากคลาส Mat หรือ เมทริกซ์ เป็นคลาสใน OpenCV Library สืบทอดมาจาก เนมสเปซ cv

Mat matrix, imgWarp;


เปลี่ยนชื่อไฟลรูปภาพเป็น 1-6-1024×680.jpg

string path = "Resources/1-6-1024x680.jpg";


ตำแหน่งพิกัดของรูปภาพ 4 จุด

Point2f scr[4] = { {108,434},{246,362},{226,593},{372,511} };
Point2f dst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} };


รับค่า

matrix = getPerspectiveTransform(scr, dst);
warpPerspective(img, imgWarp, matrix, Point(w, h));


แสดงรูภาพ

imshow("img Warp", imgWarp);


เขียนโค้ดดังนี้

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

float w = 250, h = 350;
Mat matrix, imgWarp;

int main() {

	string path = "Resources/1-6-1024x680.jpg";
	Mat img = imread(path);


	Point2f scr[4] = { {108,434},{246,362},{226,593},{372,511} };
	Point2f dst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} };

	matrix = getPerspectiveTransform(scr, dst);
	warpPerspective(img, imgWarp, matrix, Point(w, h));

	imshow("Image", img);
	imshow("img Warp", imgWarp);

	waitKey(0);
	return 0;
}


ผลลัพธ์การทำงาน img Warp แสดงภาพที่ที่เลือกมา 4 ตำแหน่ง และ Image จะแสดงภาพขนาดปรกติ


4. แสดงตำแหน่งพิกัด


แสดง รูปวงกลม 4 จุด ที่ตำแหน่งพิกัด

@คำสั่งที่เพิ่มเข้ามา


วนลูป วาดรูปวงกลม 4 จุด ที่ตำแหน่งพิกัด

for (int i = 0; i < 4; i++)
{
    circle(img, scr[i], 10, Scalar(0, 0, 255), FILLED);
}


เขียนโค้ดดังนี้

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

float w = 250, h = 350;
Mat matrix, imgWarp;

int main() {

	string path = "Resources/1-6-1024x680.jpg";
	Mat img = imread(path);


	Point2f scr[4] = { {108,434},{246,362},{226,593},{372,511} };
	Point2f dst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} };

	matrix = getPerspectiveTransform(scr, dst);
	warpPerspective(img, imgWarp, matrix, Point(w, h));

	for (int i = 0; i < 4; i++)
	{
		circle(img, scr[i], 10, Scalar(0, 0, 255), FILLED);
	}

	imshow("Image", img);
	imshow("img Warp", imgWarp);

	waitKey(0);
	return 0;
}


แสดง รูปวงกลม 4 จุด ที่ตำแหน่งพิกัด