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 배경을 얻을 수 있다!
'IT > Graphics' 카테고리의 다른 글
[Unreal Engine 5] 언리얼 엔진 5.3.2 Visual Studio 2022 세팅하기 (with 에러수정) (0) | 2024.03.17 |
---|---|
[Unreal Engine 5] 언리얼 엔진 VR 게임 튜토리얼과 C++ 사용하기 - 1 (1) | 2023.10.19 |
[OpenGL] OpenCV 이미지 OpenGL 배경으로 사용하기 (0) | 2021.08.03 |