본문 바로가기

Image Processing

[영상처리/C++/OpenCV] imread, imshow 를 통한 이미지 파일 시각화

C++ 언어의 OpenCV 라이브러리르 활용해서 이미지를 시각화 해보겠습니다.

기존에는 tool을 사용해서 이미지를 시각했었는데요, OpenCV 라이브러리를 사용하면 정말 간편하게 이미지를 시각화 할 수도 있습니다. 사실 이전에 작업했던 과정도 OpenCV를 사용했다면 훨씬 쉽게 진행 할 수 있었습니다.

 

OpenCV는 컴퓨터 비전을 공부하는데 있어 정말 편리하고, 많은 영상처리 기법을 함수화해서 가지고 있습니다. Python과 C++에서 사용 될 수 있으며 기본적인 이미지 읽기, 출력해보기 부터 시작해보겠습니다.

 

 

imread 

cv::imread(const String & filename, int flags = IMREAD_COLOR)

 

이미지를 읽는 함수 입니다. C에서 raw 파일을 읽을 때 사용하던 open함수와 동일하다고 생각하시면 됩니다. 이미지 경로를 입력으로 받고, flag는 이미지의 채널을 설정해 줄 수 있습니다 (ex, 컬러, 흑백)

 

OpenCV는 Mat 클래스를 활용해서 이미지 데이터를 저장합니다.

Mat은 header와 data pointer로 구성되어 있습니다. Header에는 저장되어 있는 이미지에 대한 정보를 담고 있으면, data pointer는 이미지의 픽셀 값을 담고 있는 메모리의 주소 정보를 담고 있습니다. 그래서 pointer라는 명칭을 사용하고 있습니다. 따라서 Mat 클래스를 복사할때는 "="  operator를 사용하지 않고 clone() 함수를 사용하여 복사를 해줍니다.

Header는 size, type, depth 정보를 보유하는데 각각은 행과 열의 크기, 각 픽셀의 데이터 type, 채널을 의미합니다.

gray는 1개의 채널, color는 3개의 채널을 갖는데 RGB 순서가 아닌 BGR 순서로 저장되어 있습니다.

 

imshow

cv::imshow(const cv::String ,cv::mat)

 

이미지를 시각화 해주는 함수 입니다. 이미지를 출력해주기 위해 winodw를 생성해 주는데, 생성해 줄 window의 이름과 출력해줄 Mat 데이터를 입력으로 사용합니다. Python의 경우 namedWinodw()를 통해 window를 생성 해주고 imshow()를 진행하지만, c++의 경우 imshow 자동 window 생성이 진행된다.

 

주의할 점은 imshow() 함수는 waitKey()함수를 필수적으로 사용해야 한다는 점이다.

 

waitKey

cv::waitKey(int delay)

window가 이미지를 출력하는데 종료 시점을 정하는 함수라고 이해할 수 있다. delay라는 변수로 얼마나 있다가 출력을 종료할 것인지를 명시해준다. delay는 ms 단위로 1000이면 1초만 출력하겠다는 뜻이다. 0을 넣는다면 무한대기를 의마하고,

이때 대기 시간 중 키보드 입력을 사용할 수 있다. 그 때 키보드를 입력한다면 waitKey함수의 리턴값은 입력된 키의 ascii 값을 가지게 된다.

 

코드 실습
 

이미지 경로를 입력으로 jpg포맷의 color 이미지를 출력해 보았습니다.

int main(int argc, char** argv)
{   
	// opencv2/core.hpp 에 존재
	cv::Mat image = cv::imread("./puppy.jpg", cv::IMREAD_COLOR);  // Mat 클래스는 이미지의 픽셀 값을 담아 놓을 행렬
	if (image.empty()) {
		cout << "ERROR : image is empty\n";
		exit(-1);
	}
	cv::Mat image2;
	cv::cvtColor(image, image2, cv::COLOR_BGR2RGB);
	//highgui.hpp 에 존재
	cv::namedWindow("yaho", cv::WINDOW_AUTOSIZE);   // image를 담을수 있는 창을 생성. 굳이 사용하지 않아도됨	
	cv::imshow("yaho", image);   // 창에 이미지를 넣어서 보여줌 
	cv::imshow("yhhoo", image2);
	

	if ((char)cv::waitKey(0) == 'a') {
		return  0;
	}
	
	return 0;
}

이미지 출력 결과