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

C++와 OpenCV를 활용해 이미지 크기를 조절하고 테두리를 추가하는 방법


이 글에서는 트랙바(trackbar)의 또 다른 활용 사례를 살펴보겠습니다. 트랙바를 이용해 이미지의 크기를 자유롭게 변경하고, 이미지에 테두리를 추가한 뒤, 같은 트랙바로 테두리의 두께까지 실시간으로 조절하는 방법을 다룹니다.

아래 프로그램을 사용하면 이미지 크기 변경, 테두리 추가, 테두리 두께 조절은 물론 이미지 회전까지 한 번에 처리할 수 있습니다. 전체적인 구조는 이전 예제와 비슷하지만, 하나의 창에 여러 개의 슬라이더를 함께 배치한다는 점이 핵심입니다.

예제 코드

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
    int Rotate = 180; //회전 각도 초기화//
    int Scale = 50; //확대·축소 배율 초기화//
    int Border = 0; //테두리 모드 초기값//
    Mat before_Rotate; //회전 전 이미지를 저장할 행렬 선언//
    int vertical = 0; //초기 세로 좌표값//
    int horizontal = 0; //초기 가로 좌표값//
    void rotator(int, void*){ //이미지를 회전시키는 콜백 함수//
    Mat Rotation = getRotationMatrix2D(Point(horizontal, vertical),(Rotate - 180), Scale / 50.0); //2D 회전을 위한 아핀 변환 행렬 생성//
    Mat Rotated; //회전된 이미지를 담을 행렬//
    warpAffine(before_Rotate, Rotated, Rotation, before_Rotate.size(), INTER_LINEAR, Border, Scalar()); //아핀 변환 적용//
    imshow("RotatedImage", Rotated); //회전된 이미지 출력//
}
int main(int argc,char**argv) {
    before_Rotate = imread("sky.jpg"); //이미지를 행렬로 불러오기//
    vertical = before_Rotate.rows / 2; //세로 방향 중심점 계산//
    horizontal = before_Rotate.cols / 2; //가로 방향 중심점 계산//
    namedWindow("BeforeRotate"); //회전 전 이미지를 표시할 창 선언//
    imshow("BeforeRotate", before_Rotate); //회전 전 이미지 출력//
    namedWindow("AfterRotate"); //회전 후 이미지를 표시할 창 선언//
    createTrackbar("Angle", "AfterRotate", &Rotate, 360, rotator); //회전 각도 조절용 트랙바 생성//
    createTrackbar("Scale", "AfterRotate", &Scale, 100, rotator); //크기 조절용 트랙바 생성//
    createTrackbar("Border Mode", "AfterRotate", &Border, 5, rotator); //테두리 추가용 트랙바 생성//
    int cbfunction = 0; //rotator 함수 인자의 초기값//
    rotator(cbfunction, &cbfunction); //콜백 함수 호출//
    waitKey(0); //키 입력이 있을 때까지 대기//
    return 0;
}

주요 함수 설명

getRotationMatrix2D() : 회전 중심 좌표, 회전 각도, 확대·축소 배율을 인자로 받아 2D 회전에 필요한 아핀 변환 행렬을 생성합니다. 코드에서는 이미지의 정중앙을 회전 중심으로 사용하기 위해 이미지의 가로·세로 픽셀 절반 지점을 계산했습니다.

warpAffine() : 앞서 생성한 아핀 변환 행렬을 원본 이미지에 실제로 적용합니다. 이때 마지막 인자인 Border 값에 따라 회전 후 이미지 가장자리 바깥 영역이 어떤 방식으로 채워질지 결정되며, 이 값은 'Border Mode' 트랙바(0~5)로 손쉽게 바꿔볼 수 있습니다.

동작 방식 요약

'Angle' 트랙바(0~360)는 이미지의 회전 각도를, 'Scale' 트랙바(0~100)는 이미지의 확대·축소 배율을, 'Border Mode' 트랙바(0~5)는 테두리 채우기 방식을 각각 제어합니다. 트랙바 값을 움직일 때마다 rotator() 콜백 함수가 호출되어 화면이 즉시 갱신됩니다.

실행 결과

C++와 OpenCV를 활용해 이미지 크기를 조절하고 테두리를 추가하는 방법