관심쟁이 영호

[#14] OpenCV (With. C++) ㅣ 화소처리 ver. 2 ㅣat함수 상세히! 본문

학교공부/OpenCV

[#14] OpenCV (With. C++) ㅣ 화소처리 ver. 2 ㅣat함수 상세히!

관심쟁이 영호 2020. 11. 18. 01:30
반응형

안녕하세요!

관심쟁이 영호입니다.

 

오늘은 지난번에 공부한 at함수를 다시 한번 짚어볼 예정이에요!

 


해당 함수에 대해서 잘 못다루는 느낌이라서

다시 한번 상세히 공부해볼 예정이에요!

 

at함수

 

이미지 행렬에 있는 값을 접근하는 함수입니다. 이미지는 행렬로 저장되어 있는데, 여기서도 1~@채널로 한 이미지에 여러 행렬이 존재한다고 생각하시면 됩니다!

 

이때 딱 한 곳에 해당하는 위치를 접근할 때 사용하는 함수가 at() 함수입니다!

 

먼저, 이 함수를 사용하기 위해서는 접근하려는 위치를 알려주는 것이 가장 먼저겠죠!?

그 위치를 알려주는 방법이 아주 많아요!

방법들을 먼저 살펴보자면,

 

1. point 객체

2. vec 객체

3. 그냥 int타입의 정수

 

이렇게 접근을 할 수가 있어요!

 

그럼 코드로 살펴볼게요.

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;



void main() {

	Mat m1(3, 5, CV_32SC1, Scalar(100));
	Mat m2(3, 5, CV_32FC1, Scalar(0));
	Mat m3(3, 5, CV_8UC2);
	Mat m4(3, 5, CV_32SC3);
	
	cout << "수정 전----------------------------" << endl << endl;
	cout << "[m1] = " << endl << m1 << endl << endl;
	cout << "[m2] = " << endl << m2 << endl << endl;
	
	for (int i = 0, k = 0; i < m1.rows; i++)
	{
		for (int j = 0; j < m1.cols; j++, k++)
		{
			
			m1.at<int>(i, j) = k;
			Point pt(j, i);
			m2.at<float>(pt) = (float)j;

			int idx[2] = { i, j };
			m3.at<Vec2b>(idx) = Vec2b(0, 1);

			m4.at<Vec3i>(i, j)[0] = 0;
			m4.at<Vec3i>(i, j)[1] = 1;
			m4.at<Vec3i>(i, j)[2] = 2;
		}


	}
	
	cout << "수정 후----------------------------" << endl;
	cout << "[m1] =" << endl << m1 << endl << endl;
	cout << "[m1] =" << endl << m2 << endl << endl;
	cout << "[m1] =" << endl << m3 << endl << endl;
	cout << "[m1] =" << endl << m4 << endl << endl;
}

그럼 결과를 살펴볼게요!

코드 풀이

 

먼저 m1, m2, m3, m4를 선언했어요!

모든 행렬은 3x5의 크기를 가지고 있고,

 

m1은 32S타입에 채널은 1개, 100의 스칼라 값으로 초기화.

m2는 32F타입에 채널은 1개, 0의 스칼라 값으로 초기화.

m3는 8U타입에 채널은 2개

m3는 32S타입에 채널은 3개

 

라고 선언 및 초기화를 했고!

 

그리고 반복문을 통해서 다시 한번

m1은 int타입의 정수로 직접 접근하여 초기화!

m2는 point객체로 접근하여 초기화!

m3는 배열을 이용하여 초기화!

m4는 Vecter객체를 이용하여 초기화!

 

여기서 체크포인트는

 

Point로 접근할 때 Point(y, x)로 접근하여야 합니다!!!

 

끄읏!


오늘은 여기까지 해볼게요!!

다음은 현재까지 배워온 것을 기반으로 문제를 풀어보도록 하겠습니다.

 

300x250
Comments