๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[C++ ๋ก OpenCV ๊ตฌํํ๊ธฐ] (5) Wrap Perspective ๋ณธ๋ฌธ
[C++ ๋ก OpenCV ๊ตฌํํ๊ธฐ] (5) Wrap Perspective
์ง์ง์ํ์นด 2023. 6. 12. 15:54<๋ณธ ๋ธ๋ก๊ทธ๋ Murtaza's Workshop ์ ์ ํ๋ธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค :-)>
=> LEARN OPENCV C++ in 4 HOURS | Including 3x Projects | Computer Vision
๐ Wrap Perspective
๐ง getPerspectiveTransform
์๊ทผ ๋ณํ์ ์ด๋ฏธ์ง๋ฅผ 3์ฐจ์์ผ๋ก ๋ณํ
๋ฉ๋ฆฌ ์๋ ๊ฒ์ ์๊ฒ ๋ณด์ด๊ณ , ๊ฐ๊น์ด ์๋ ๊ฒ์ ํฌ๊ฒ ๋ณด์ด๋ ๊ฒ ์๊ทผ๋ฒ์ ์๋ฆฌ
์๊ทผ ๋ณํ์ ํ์ํ ๋ณํ ํ๋ ฌ์ ๋ฐํํด์ฃผ๋ ํจ์
mtrx = cv2.getPerspectiveTransform(pts1, pts2)
pts1 : ๋ณํ ์ด์ ์์์ ์ขํ 4๊ฐ, 4 x 2 ๋ฐฐ์ด
pts2 : ๋ณํ ์ดํ ์์์ ์ขํ 4๊ฐ, 4 x 2 ๋ฐฐ์ด
mtrx : ๋ณํํ๋ ฌ ๋ฐํ, 3 x 3 ํ๋ ฌ
๐ง warpPerspective
์ ๋ ฅ ์ด๋ฏธ์ง(src)์ ์๊ทผ ๋งต ํ๋ ฌ(M)์ ์ ์ฉํ๊ณ , ์ถ๋ ฅ ์ด๋ฏธ์ง ํฌ๊ธฐ(dsize)๋ก ๋ณํํด์ ์ถ๋ ฅ ์ด๋ฏธ์ง(dst)๋ฅผ ๋ฐํ
warpPerspective(src, M, dsize, dst, flags, borderMode, borderValue)
src : ์ ๋ ฅ ์ด๋ฏธ์ง
M : ์๊ทผ ๋งต ํ๋ ฌ
dsize : ์ถ๋ ฅ ์ด๋ฏธ์ง ํฌ๊ธฐ
dst : ์ถ๋ ฅ ์ด๋ฏธ์ง
#include <opencv2/opencv.hpp> // OpenCV์์ ์ง์ํ๋ ๋ชจ๋ ๊ธฐ๋ฅ
#include <opencv2/videoio.hpp> // ๋น๋์ค ์ถ์ ๋ฐ ๋ฐฐ๊ฒฝ segmentation๊ณผ ๊ด๋ จ๋ ๋ฃจํด
#include <opencv2/imgcodecs.hpp> // ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
์ด ์ ์ธ (Mat ์ด๋ Point๊ฐ ์ ์ธ, ํ๋ ฌ ์ฐ์ฐ ํน์ ๋ฒกํฐ ์ฐ์ฐ)
#include <opencv2/highgui.hpp> // ์๋์ฐ ํ๋ฉด, UI์ฒ๋ฆฌ(์ฌ๋ผ์ด๋, ๋ฒํผ ๋ฑ) ๋ฐ ๋ง์ฐ์ค ์ ์ด ๊ฐ๋ฅ
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
// #5. Wrap Perspective
void main() {
string path = "Resources/cards.jpg";
Mat img = imread(path);
Mat matrix, imgWarp;
float w = 250, h = 350;
Point2f src[4] = { {529,142},{771,190},{405,395},{674,457} };
Point2f dst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} };
// getPerspectiveTransform(pts1, pts2)
// ์๊ทผ ๋ณํ ํ๋ ฌ ๊ณ์ฐ
matrix = getPerspectiveTransform(src, dst);
// warpPerspective(src, M, dsize, dst, flags, borderMode, borderValue)
// ์๊ทผ ๋ณํ ์ ์ฉ
warpPerspective(img, imgWarp, matrix, Point(w, h));
for (int i = 0; i < 4; i++)
{
circle(img, src[i], 10, Scalar(0, 0, 255), FILLED);
}
imshow("Image", img);
imshow("Image Warp", imgWarp);
waitKey(0);
}