Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++와 OpenCV로 비디오 회전하기: 단계별 완벽 가이드

비디오 회전의 기본 개념

비디오를 회전하는 작업은 이미지를 회전하는 것과 원리가 거의 동일합니다. 유일한 차이점은 정지된 이미지 하나를 행렬에 불러오는 대신, 비디오 파일을 읽어들이거나 카메라에서 실시간으로 전송되는 비디오 스트림을 받아 처리한다는 점입니다.

이번 예제에서는 비디오 파일을 따로 로드하지 않고 기본 카메라로부터 영상을 입력받습니다. 만약 저장된 비디오 파일을 사용하고 싶다면 VideoCapture 객체에 해당 파일의 경로를 정확하게 지정해 주기만 하면 됩니다.

핵심 함수 살펴보기

getRotationMatrix2D()

회전 중심 좌표, 회전 각도, 배율(scale)을 인자로 받아 2×3 크기의 어파인 변환 행렬을 생성합니다. 이 행렬은 이후 warpAffine() 함수에 전달되어 실제 회전 연산에 사용됩니다.

warpAffine()

생성된 변환 행렬을 실제 프레임에 적용하여 회전된 결과 이미지를 출력 행렬에 저장합니다. 비디오의 모든 프레임에 이 과정을 반복하면 회전된 비디오를 얻을 수 있습니다.

예제 코드

다음 프로그램은 C++를 사용하여 OpenCV에서 비디오를 회전하는 방법을 보여줍니다.

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[]) {
    VideoCapture loadvideo(0);//기본 카메라에서 비디오 캡처//
    namedWindow("OriginalVideo");//원본 비디오 스트림을 표시할 창 생성//
    namedWindow("RotatedVideo");//회전된 비디오 스트림을 표시할 창 생성//
    int rotating_angle = 180;//초기 회전 각도//
    createTrackbar("Rotation", "RotatedVideo", &rotating_angle, 360);//회전 각도 조절용 트랙바 생성//
    while (true) {
        Mat before_Rotating;//회전 전 이미지를 담을 행렬 선언//
        bool temp = loadvideo.read(before_Rotating);//비디오 소스에서 프레임을 행렬로 불러옴//
        imshow("OriginalVideo", before_Rotating);//회전 전 프레임 표시//
        Mat for_Rotation = getRotationMatrix2D(Point(before_Rotating.cols / 2, before_Rotating.rows / 2), (rotating_angle - 180), 1);//2D 회전을 위한 어파인 변환 행렬 생성//
        Mat after_Rotating;//회전 후 이미지를 담을 행렬 선언//
        warpAffine(before_Rotating, after_Rotating, for_Rotation, before_Rotating.size());//어파인 변환 적용//
        imshow("RotatedVideo", after_Rotating);//회전 후 프레임 표시//
        if (waitKey(30) == 27){ //Esc 키가 눌리면 종료//
            break;
        }
    }
    return 0;
}

실행 결과

프로그램을 실행하면 두 개의 창이 나타납니다. 'OriginalVideo' 창에는 카메라에서 입력된 원본 영상이 그대로 재생되고, 'RotatedVideo' 창에는 회전이 적용된 영상이 표시됩니다. 화면에 나타난 트랙바를 드래그하면 회전 각도를 자유롭게 조절할 수 있으며, Esc 키를 누르면 프로그램이 종료됩니다.

C++와 OpenCV로 비디오 회전하기: 단계별 완벽 가이드

마무리

이처럼 OpenCV의 getRotationMatrix2D()와 warpAffine() 함수를 조합하면 정지 이미지뿐 아니라 실시간 비디오 스트림도 손쉽게 회전시킬 수 있습니다. 트랙바를 함께 활용하면 프로그램 실행 중에도 각도를 실시간으로 변경할 수 있어, 다양한 영상 처리 실험이나 응용 프로그램 개발에 유용하게 사용할 수 있습니다.