OpenCV 영상 불러와서 출력하기

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

using namespace std; // 원래는 std::cerr 이런식으로 앞에 작성해야하는데 생략 가능하게 함
using namespace cv; // 원래는 cv::Mat, cv::imread, cv::namedWindow 이런식으로 앞에 작성해야하는데 생략 가능하게 함

int main()
{
	Mat img = imread("lenna.bmp"); // Mat : 행렬(Matrix)를 표현하는 class

	if (img.empty()) {
		cerr << "Image laod failed!" << endl;
		return -1;
	}

	namedWindow("image");
	imshow("image", img);
	waitKey();
	destroyAllWindows();
}

OpenCV 주요 함수 설명

영상 파일을 불러오기
Mat imread(const String& filename, int flags = IMREAD_COLOR);
  • filename : 불러올 영상 파일 이름

    e.g. “lenna.bmp” , “C:\\lena.bmp”

  • flags : 영상 파일 불러오기 옵션 플래그
    • IMREAD_UNCHANGED : 영상 속성 그대로 읽기
    • IMREAD_GRAYSCALE : 1채널 그레이스케일 영상으로 읽기
    • IMREAD_COLOR : 3채널 BGR 컬러 영상으로 읽기
  • 반환값 : 불러온 영상 데이터 (MAT 객체)
    • Mat img = imread("lenna.bmp");코드는 img 변수가 imread 함수의 반환 값을 받는 것
영상 파일 저장하기
bool imwrite(const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
  • filename : 저장할 영상 파일 이름, 파일 이름에 포함된 확장자를 분석하여 해당 파일 형식으로 저장됨

  • img : 저장할 영상 데이터 (Mat 객체)

  • params : 파일 저장 옵션 지정

    e.g. JPG 압축율을 90%로 지정하고 싶으면, {IMWRITE_JPEG_QUALITY,90}을 지정

  • 반환값 : 정상적으로 저장하면 true를 반환하고 실패하면 false를 반환함

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

using namespace std; 
using namespace cv; 

int main()
{
	Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE); //lenna.bmp 파일을 그레이스케일을 적용하여 img 객체에 넣고
	
	if (img.empty()) {
		cerr << "Image laod failed!" << endl;
		return -1;
	}

	imwrite("lenna.png", img); // img 객체를 lenna.png로 영상 파일 저장

	namedWindow("image");
	imshow("image", img);
	waitKey();
	destroyAllWindows();
}
영상 출력하기
void imshow(const String& winname, InputArray mat);
  • winname : 영상을 출력할 대상 창 이름
  • mat : 출력할 영상 데이터 (Mat 객체)

  • 영상 출력 방식
    • 8-bit unsigned : 픽셀 값을 그대로 출력
    • 16-bit unsigned / 32-bit integer : 픽셀 값을 255로 나눠서 출력
    • 32-bit(float 타입) / 64-bit(double 타입) floating-point : 픽셀 값을 255를 곱 해서 출력
  • 만약 winname에 해당하는 창이 없으면 WINDOW_AUTOSIZE 속성의 창을 새로 만들고 영상을 출력함
  • 실제로 waitKey() 함수를 호출해야 imshow 함수가 실행한 영상이 화면에 나타남
키보드 입력 대기
int waitKey(int delay =0);
  • delay : 밀리초 단위 대기 시간, delay가 0 이상이면 무한히 기다림
  • 반환 값 : 눌린 키 값을 반환하고 키가 눌리지 않으면 -1을 반환함
  • waitKey 함수는 OpenCV 창이 하나라도 있어야 정상 동작
  • 주요 특수키 코드 : ESC - 77, ENTER - 13, TAB - 9
#include <iostream>
#include "opencv2/opencv.hpp" 

using namespace std;
using namespace cv; 

int main()
{
	Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (img.empty()) {
		cerr << "Image laod failed!" << endl;
		return -1;
	}

	imwrite("lenna.png", img);

	namedWindow("image", WINDOW_NORMAL);
	imshow("image", img);
	while (true) {

		if (waitKey() == 27) // 다른 키를 누르면 반응이 없고 ESC 키를 누르게되면 break가 됨
			break;
	}
	destroyAllWindows();
}
비어 있는 Mat 객체 확인
bool Mat::empty() const
  • 반환값 : 안에 비어 있으면 True를 반환하고 비어있지 않은 경우 False를 반환
새 창 띄우기
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE)
  • winname : 창 고유 이름으로 이 이름으로 창을 구분함
  • flags : 창 속성 지정 플래그
    • WINDOW_NORMAL : 영상 크기가 창 크기에 맞게 지정됨
    • WINDOW_AUTOSIZE : 창 크기가 영상 크기에 맞춰 자동으로 변경
    • WINDOW_OPENGL : OpenGL 지원
#include <iostream>
#include "opencv2/opencv.hpp" 

using namespace std;
using namespace cv; 

int main()
{
	Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (img.empty()) {
		cerr << "Image laod failed!" << endl;
		return -1;
	}

	imwrite("lenna.png", img);

	namedWindow("image", WINDOW_NORMAL); // NORMAL 에서는 창크기를 변경할 수 있지만, AutoSize는 불가능함
	imshow("image", img);
	waitKey();
	destroyAllWindows();
}
창 닫기
void destoryWindow(const String& winname);
void destoryAllWindows() // 현재 생성되어있는 모든 OpenCV 창을 닫음
  • winname : 닫으려는 창의 이름
  • 일반적으로 프로그램 종료시 운영체제에 의해 열려있는 모든 창이 자동으로 닫힘
#include <iostream>
#include "opencv2/opencv.hpp" 

using namespace std; // 원래는 std::cerr 이런식으로 앞에 작성해야하는데 생략 가능하게 함
using namespace cv; // 원래는 cv::Mat, cv::imread, cv::namedWindow 이런식으로 앞에 작성해야하는데 생략 가능하게 함

int main()
{
	Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE); // Mat : 행렬(Matrix)를 표현하는 class

	if (img.empty()) {
		cerr << "Image laod failed!" << endl;
		return -1;
	}

	imwrite("lenna.png", img);

	namedWindow("image", WINDOW_NORMAL);
	imshow("image", img);
	waitKey();
	// destroyAllWindows(); // 생략해도 동일한 결과가 나타남
}
창 위치 지정
void moveWindow(const String& winname, int x, int y);
  • winname : 창 이름
  • x, y : 이동할 위치 좌표
창 크기 지정
void resizeWindow(const String& winname, int width, int height);
  • winname : 창 이름

  • width, height : 변경할 창 크기
  • 윈도우가 WINDOW_NORMAL 속성으로 생성되어야 동작함

이미지 파일 형식 변환 프로그램

int main(int argc, char* argv[])
{
	// TODO : 명령행 인자 개수가 3개보다 적으면 사용법을 출력하고 종료하세요.
	if(/* 코드 입력 */){
		cout << "Usage : ocvrt.exe <src_image> <dst_image>" << endl;
		return 0;
	}
	
	// TODO : 첫 번째 이미지 파일을 imread() 함수로 읽어서 img 변수에 저장
	/* 코드 입력 */
	
	// TODO : 두 번째 이미지 파일 이름을 img 영상을 저장
	// 저장이 제대로 되면 ret 변수에 true를, 실패하면 false를 저장
	/* 코드 입력 */
	
	
	if(ret) {
		cout << argv[1] << " is successfully saved as " << argv[2] << endl;
	} else {
		cout << "File save failed! << endl;
 	}
}

OpenCV API 도움말 찾기

  • http://docs.opencv.org/