OpenCV에서 파일 열기

사진 파일을 불러와서 화면에 출력해 보자!

예시 코드

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

using namespace std;
using namespace cv;

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

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

	imwrite("lenna.png", img);

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

결과

사진이 잘 출력 된다.

하나씩 알아 보자.

참고로, OpenCV docs에서 자세하고 정확한 정보를 알 수 있다.

헤더와 namespace

  • #include "opencv2/opencv.hpp" : OpenCV의 모든 기능을 사용할 수 있게 하는 헤더.
  • using namespace cv; : OpenCV 클래스를 사용할 때 cv::를 생략하게 해 준다.

Mat 클래스와 주요 영상 처리 함수

0. Mat 클래스

  • OpenCV의 다차원 배열 클래스이다. Mat클래스에 대한 자세한 내용은 여기에

1. imread : 파일 읽기

Mat cv::imread(const String& filename, int flags = IMREAD_COLOR )	
  • filename : 불러올 영상 이름
  • flags : 영상 파일 불러오기 옵션
Mat img = imread("lenna.bmp");  // default
Mat img = imread("lenna.bmp", IMREAD_UNCHANGED);  // default
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);  // 1채널 grayscale 영상으로 읽기
Mat img = imread("lenna.bmp", IMREAD_COLOR);  // 3채널 RGB 컬러 영상으로 읽기

같은 흑백 영상이라도 컴퓨터에게 1채널이냐, 3채널이냐는 명확하게 지정해 줘야 한다.

imread("lenna.bmp")imread("lenna.bmp", IMREAD_GRAYSCALE)의 차이

원본이 컬러 사진이어도, 옵션에 IMREAD_GRAYSCALE를 넣으면 흑백으로 출력된다.

2. empty : 비어있는 Mat객체 확인

bool cv::Mat::empty() const

흔히 사용되는 empty함수이다.

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

이미지를 처리하기 전에, 잘 저장 됐는지 확인하는 코드를 설정해주면 좋다.(권장)

3. imwrite : 영상 파일을 저장

함수 원형

bool cv::imwrite(const String& filename, InputArray img, 
					const std::vector<int>& params = std::vector<int>());

filename : 저장할 영상 파일 이름. 이름에 포함된 확장자(jpg, png 등)를 인식해 그에 맞는 파일 형식으로 저장
img : 저장할 영상 데이터(Mat 객체)
params : 파일 저장 옵션 ex) {IMWRITE_JPEG_QUALITY, 90} : JPG압축율 90%

사용 예시

// ...
Mat img = imread("lenna.bmp");
// ...
imwrite("lenna.png", img);
// ...

실행 사진

lenna.bmplenna.png로 저장하였다.

4. imshow : 영상 출력

함수 원형

void cv::imshow(const String& winname, InputArray mat);	

winname : 영상을 출력할 창 이름
mat : 영상 데이터

사용 예시

Mat img = imread("lenna.bmp");
// ...
//namedWindow("window"); // imshow만 사용해도 자동으로 WINDOW_AUTOSIZE속성의 창을 생성한다.
imshow("window", img);
waitKey(); // waitkey() 함수가 있어야 실제로 화면에 영상이 나타난다.

5. waitKey : 키보드 입력 대기

함수 원형

int cv::waitKey(int delay = 0)	

delay : 대기 초(ms단위). delay=0일 때는 무한히 기다림.

waitKey는 눌린 키 값이 반환되는데, 이를 통해 특정 키를 눌렸을 때 창이 꺼지도록 설정할 수 있다.
주요 키 코드는

ESC = 27
Enter = 13
Tab = 9

사용 예시

waitKey(); // 키 입력이 있을 때 까지 기다린다.
waitKey(10); // 10ms만큼 기다린다.

// esc를 눌렀을 때 종료
while(true){
	if(waitKey() == 27)		break;
}

영상 처리 외 필요한 함수들

1. namedWindow : 새 창 띄우기

함수 원형

void cv::namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);	

winname : 창 이름
flags : 창 속성 지정

사용 예시

namedWindow("window");	// Default
namedWindow("window", WINDOW_AUTOSIZE); // 영상 크기에 맞게 자동으로 창 설정 (=Default)
namedWindow("window", WINDOW_NORMAL); // 영상 크기가 창 크기에 맞게 지정 (크기 조절 가능)

실행 사진

namedWindow("window", WINDOW_NORMAL)를 실행해 보자.

2. destroyWindow : 창 닫기

함수 원형

void cv::destroyWindow(const String& winname);
void cv::destroyAllWindows()

winname : 닫을 창 이름

사용 예시

destroyWindow("window"); // window 창 닫기
destroyAllWindows(); // 모든 창 닫기

보통 프로그램을 종료할 때 destroyAllWindows()로 창을 종료한다.

3. moveWindow : 함수설명

함수 원형

void cv::moveWindow(const String& winname, int x, int y)

winname : 움직일 창 이름
x : 이동할 위치 x 좌표
y : 이동할 위치 y 좌표

사용 예시

namedWindow("window");
moveWindow("window", 0, 0); //내 컴퓨터 기준 (0, 0)좌표에 창이 생성된다.

4. resizewindow : 창 크기 지정

함수 원형

void cv::resizeWindow(const String&	winname, int width, int height);	

winname : 크기를 지정할 창 이름
width : 가로 크기
height : 세로 크기
참고! WINDOW_NORMAL속성 창만 동작한다.

사용 예시

namedWindow("window", WINDOW_NORMAL); // resizeWindow 사용시에는 꼭 WINDOW_NORMAL
resizeWindow("window", 1920, 1080); // 1920x1080 크기로 변경된다.

참고 : 콘솔 창에 뜨는 로고를 없애 보자.

영상을 출력하면,

출력은 잘 됐지만, 뭔가 많이 나온다.

오류는 아니지만, 미관상 안 좋으니 솔루션 구성을 Debug -> Release로 바꿔주면 저런 로그 메시지가 없어진다고 한다.


본인의 IDE에 따라 잘 설정해 봅시다.

결과

깔끔해 졌다.

동영상 및 카메라 입출력

카메라 받아오기

VideoCapture cap;
cap.open(0);	// 0번 카메라 연결
cap.open("video.mp4");

// ...

cap.release(); // 카메라 닫아 주기
destroyAllWindows(); // 모든 창 닫기

동영상 받아오기

VideoCapture cap;
cap.open("video.mp4");	// video.mp4 파일 연결

// ...
destroyAllWindows(); // 모든 창 닫기

영상에 필터 적용하기

Canny(frame, edge, 50, 150);

영상에 Edge만 표시할 수 있다.

영상 크기 지정하기

cap.set(CAP_PROP_FRAME_WIDTH, 1280);
cap.set(CAP_PROP_FRAME_HEIGHT, 720);

영상의 크기를 1280x720으로 변환.

영상 저장하기

int fourcc = VideoWriter::fourcc('X', 'V', 'I', 'D'); //코덱 설정
double fps = 30;
Size sz((int)cap.get(CAP_PROP_FRAME_WIDTH), (int)cap.get(CAP_PROP_FRAME_HEIGHT));

VideoWriter output("output.avi", fourcc, fps, sz);
profile
올해로 26세

0개의 댓글