IT/Graphics

[OpenGL] OpenCV 동영상(Video) OpenGL 배경으로 사용하기

버건디 팩토리 2021. 8. 3. 23:38
반응형

OpenCV 동영상을 OpenGL 배경으로

지난번에는 단순한 이미지를 텍스처로 이용해 OpenGL 배경으로 사용해보았다.

이번에는 동영상을 배경으로 넣는 프로젝트를 진행할 것이다.

 

지난번 코드 기반으로 설명할 예정이니 아래 포스트를 참고를 부탁한다!!!

[OpenGL] OpenCV 이미지 OpenGL 배경으로 사용하기

Idea

OpenGL 내에는 glutIdleFunc 함수가 있다.

이를 통해 아무런 작업을 하지 않더라도 일정 시간마다 같은 task를 불러올 수 있다.

이번 포스트에서는 해당 함수를 통해 동영상 내 프레임을 위 링크의 setImage 함수를 통해 불러오고, 텍스쳐로 사용해 배경 설정을 진행하려고 한다.

 

Code

OpenCV 동영상 불러오기

main 함수 시작 전 VideoCapture 클래스를 통해 동영상을 불러온다.

이때 VideoCapture 는 OpenGL 함수에서도 사용해야 하므로 전역변수로 선언한다!

참고로 내 동영상 크기가 너무 커서 resize를 시켰으니 만약 해당 코드를 활용한다면 이는 삭제해서 사용하자!

VideoCapture cap;

int w = 640;
int h = 480;

```

int main(int argc, char **argv) {

	cap.open("test.mp4");

	if (!cap.isOpened())
	{
		printf("Can't open the video");
		return -1;
	}

	cap >> colorImage;
	cvtColor(colorImage, colorImage, CV_RGB2BGR);
	resize(colorImage, colorImage, Size(640, 480));

	SetImage(colorImage.data);

	```
    
}

 

OpenGL

idle 함수 선언

idea에서 말한 것과 같이 main 함수 내에서 glutIdleFunc(idle) 선언을 통해 idle 함수를 계속 불러올 수 있다.

이를 활용하여 동영상 내 frame을 불러오는 함수 idle을 만들어보자!

void idle() {
	cap >> colorImage;
	cvtColor(colorImage, colorImage, CV_RGB2BGR);
	resize(colorImage, colorImage, Size(640, 480));		// 원하는 크기로의 resize

	SetImage(colorImage.data);

	// 원하는 만큼의 fps를 가지도록 선언
	waitKey(27);

	// gl 이미지를 바꿔주기 위해 선언한다
	glutPostRedisplay();
}

전역변수 VideoCapture cap 을 이용해 frame을 계속 불러온다.

나는 waitKey 함수를 통해 동영상의 frame을 조정했다.

여기서 중요한 함수는 glutPostRedisplay 이다. 이를 통해 윈도우를 다시 그리도록 요청할 수 있어 frame 변경에 따라 texture를 바꿀 수 있다.

main

이제 해당 함수를 main 함수에 아래와 같이 추가한다면 원하는 결과를 얻을 수 있다!

int main(int argc, char **argv) {

	```

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

	glutInitWindowSize(w, h);
	glutInitWindowPosition(w / 2, h / 2);
	glutCreateWindow("Image Background");

	init();
	
	glutDisplayFunc(draw);
	glutIdleFunc(idle);

	glutMainLoop();

	return EXIT_SUCCESS;
}

Result

아래와 같이 동영상이 그려진 OpenGL 배경을 얻을 수 있다!

반응형