การแปลงภาพแบบ 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 จุด ที่ตำแหน่งพิกัด