영상처리를 하기 위해 미리 녹화된 동영상을 쓰는 경우가 있다. 이번시간에는 동영상을 띄우는 방법에 대해 알아보도록 하겠다.

동영상 파일을 여는 일은 이미지 파일을 출력했던것 만큼 쉽다. 하지만 방법이 약간 다르다.

이미지 파일은 단순히 한장의 영상이지만, 동영상은 이미지 파일의 집합이라고 볼 수 있다. 여러개의 사진이 계속해서 바뀌는 개념이다. 그렇기 때문에 매 프레임마다 화면을 바꿔준다고 생각하면 될 것이다.


코드는 다음과 같다.

#include <opencv\highgui.h>

int main() {
	IplImage *frame;
	
	CvCapture* capture = cvCaptureFromFile("testAVI.avi");
	//CvCapture* capture = cvCreateFileCapture("testAVI.avi");
	//CvCapture* capture = cvCaptureFromAVI("testAVI.avi");

	cvNamedWindow("Test",1);
	
	while(capture) {
		frame = cvQueryFrame(capture);
		cvShowImage("Test",frame);

		if(cvWaitKey(33) == 27)
			break;
	}
	cvReleaseCapture(&capture);
	cvDestroyWindow("Test");

	return 0;
}

CvCapture형식의 capture에 영상을 저장한다.

동영상 파일을 불러올 때는 cvCaptureFromFile() 이나 cvCreateFileCapture() 또는 cvCaptureFromAVI()중 하나를 선택하여 사용한다. 각 함수의 차이점은 크게 없어보인다. 

인자로는 파일이름, 파일형식을 넣어준다. 

파일 형식은 avi, wmv, mp4, 3gp, mkv 등등이 되는 것 같다. 아마 왠만한 파일 형식은 로드가 될 것이지만 avi파일을 로드하는 것을 추천한다.

반복문이 시작하기 전에 cvNamedWindow()를 이용하여 영상을 띄울 윈도우를 생성한다.

while문을 사용하여 영상을 띄워준다. capture가 null이 아닐경우 반복문을 실행한다.

IplImage형식의 frame이라는 변수에 capture를 통해 얻어온 이미지를 cvQueryFrame()을 이용하여 입혀준다. 

cvWaitKey()를 이용하여 ESC를 입력하였을 때 종료하도록 한다.

cvWaitKey(33)에서 33은 프레임을 받아오는 속도이다. 단위는 미리 세컨드이다(1/1000초). 값이 높을수록 프레임이 느리다. 33을 입력하면 33/1000 이므로 대략 초당 30프레임정도를 받아올 것이다.


영상처리를 위한 코드는 while문 안에 cvQueryFrame()을 수행한 뒤에 넣어주면 된다.


실행화면 : 


capture의 값만 cvCaptureFromCAM()으로 변경해 준다면 웹캠영상도 띄울수 있다.


[영상처리] 이미지 파일 출력


[영상처리] 카메라(웹캠)영상 출력

+ Recent posts