๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[C++ ๋กœ OpenCV ๊ตฌํ˜„ํ•˜๊ธฐ] (5) Wrap Perspective ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป IoT (Embedded)/Image Processing

[C++ ๋กœ OpenCV ๊ตฌํ˜„ํ•˜๊ธฐ] (5) Wrap Perspective

์ง•์ง•์•ŒํŒŒ์นด 2023. 6. 12. 15:54
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” 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);

}

728x90
๋ฐ˜์‘ํ˜•
Comments