[HCI] 05. 관심영역 지정, 로고 삽입

조혜정·2021년 10월 9일
1
post-thumbnail

✔ 관심 영역 지정

관심영역 (ROI)
관심 영역 ROI는 Region Of Interest로 의미 그대로 이미지 내부의 관심있는 영역을 의미한다.
사각형 형태의 관심 영역 지정하기
Mat A = imread("lenna.jpg", IMREAD_COLOR);
Rect r(10, 10, 100, 100); // x1, y1, width, height
Mat D = A(r); // Shallow Copy(얕은 복사, 공유)
관심 영역 black으로 변환
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat A;
	A = imread("lenna.jpg", IMREAD_COLOR);
	if (A.empty()) { cout << " no image" << endl; return -1; }

	Rect r(10, 10, 100, 100);
	Mat D = A(r);  // A의 r부분을 D가 pointing (얕은 복사)
	D = Scalar(0, 0, 0);  // 관심 영역의 모든 화소가 (0, 0, 0)이 된다. 
	
	imshow("src", A);
	waitKey();
	return 0;
}
실행 결과

✔ Mat 복사 및 자료형 반환 메소드(Deep Copy)

Code
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	double data[] = {
		1.1, 2.2, 3.3, 4.4,
		5.5, 6.6, 7.7, 8.0,
		9.9, 10, 11, 12
	};

	Mat m1(3, 4, CV_64F, data);
	Mat m2 = m1.clone(); // 새로운 행렬 반환

	Mat m3, m4;
	m1.copyTo(m3); // 행렬을 parameter로 들어온 행렬에 복사
	m1.convertTo(m4, CV_8U); // 데이터 타입 변경

	cout << "[m1] = " << m1 << "\n\n";
	cout << "[m2] = " << m2 << "\n\n";
	cout << "[m3] = " << m3 << "\n\n";
	cout << "[m4] = " << m4 << "\n\n";
   
	// m3의 데이터 변화는 m1에게 미치지 않는다. (Deep Copy)
	m3 = 1.1;
	cout << "[m1] = " << m1 << "\n\n";
	cout << "[m3] = " << m3 << "\n\n";
	waitKey();
	return 0;
}
실행 화면

✔ 관심 영역 로고 삽입

오른쪽 하단에 로고 삽입
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat A = imread("sea.jpg", IMREAD_COLOR);
	Mat B = imread("logo.jpg", IMREAD_COLOR);
	
	// (widthA - widthB, heightA - heightB) 위치에서
	// widthB, heightB의 직사각형을 관심영역으로
	Rect R(A.cols - B.cols, A.rows - B.rows, B.cols, B.rows);

	Mat roi(A, R);
	B.copyTo(roi);

	imshow("sea & logo", A);
	waitKey();
	return 0;
}
참고

✔ 관심 영역 값으로 출력하기

Mat A = imread("lenna.jpg", IMREAD_COLOR);
Mat roi(A, Rect(10, 10, 2, 2));

cout << "[roi] = \n" << roi << "\n";

// (10, 10)위치의 B, G, R 값 , (10, 11)위치의 B, G, R 값
// (10, 11)위치의 B, G, R 값 , (11, 11)위치의 B, G, R 값 을 출력한다.
실행 화면

✔ 영상 사이즈 변경 resize()

Mat src = imread(""lenna.jpg");
Mat dst;
resize(std, dst, Size(100, 100));
imshow("smallImage", dst);
실행 화면

✔ Test Image

lenna.jpg (400 x 400)
sea.jpg (509 x 339)
logo.jpg (80 x 40)

profile
ʜʏᴇᴘᴘʏ ᴅᴇᴠ

0개의 댓글