더북(TheBook)

그러면 특수 각도에 대한 영상의 회전 변환을 C/C++ 함수로 작성해보도록 하자. 영상을 90°, 180°, 270° 만큼 회전시키는 함수의 이름을 각각 IppRotate90, IppRotate180, IppRotate270을 사용하기로 하고, 다음과 같은 함수 선언을 IppGeometry.h 파일에 추가하자.

void IppRotate90(IppByteImage& imgSrc, IppByteImage& imgDst);
void IppRotate180(IppByteImage& imgSrc, IppByteImage& imgDst);
void IppRotate270(IppByteImage& imgSrc, IppByteImage& imgDst);

세 개의 함수는 모두 IppByteImage 타입의 입력 영상 imgSrc를 각각 정해진 각도만큼 회전하여 결과 영상을 imgDst에 저장한다. IppRotate90, IppRotate180, IppRotate270 함수의 전체 구현은 소스 9-10에 모두 나타내었다.

소스 9-10 특수 각도에 대한 회전 변환 구현 함수(IppGeometry.cpp)
void IppRotate90(IppByteImage& imgSrc, IppByteImage& imgDst)
{
    int w = imgSrc.GetWidth();
    int h = imgSrc.GetHeight();

    imgDst.CreateImage(h, w);

    BYTE** pSrc = imgSrc.GetPixels2D();
    BYTE** pDst = imgDst.GetPixels2D();

    int i, j;
    for (j = 0; j < w; j++)
    for (i = 0; i < h; i++)
    {
        pDst[j][i] = pSrc[h - 1 - i][j];
    }
}

void IppRotate180(IppByteImage& imgSrc, IppByteImage& imgDst)
{
    int w = imgSrc.GetWidth();
    int h = imgSrc.GetHeight();

    imgDst.CreateImage(w, h);

    BYTE** pSrc = imgSrc.GetPixels2D();
    BYTE** pDst = imgDst.GetPixels2D();

    int i, j;
    for (j = 0; j < h; j++)
    for (i = 0; i < w; i++)
    {
        pDst[j][i] = pSrc[h - 1 - j][w - 1 - i];
    }
}

void IppRotate270(IppByteImage& imgSrc, IppByteImage& imgDst)
{
    IppByteImage cpy = imgSrc;

    int w = imgSrc.GetWidth();
    int h = imgSrc.GetHeight();

    imgDst.CreateImage(h, w);

    BYTE** pSrc = imgSrc.GetPixels2D();
    BYTE** pDst = imgDst.GetPixels2D();

    int i, j;
    for (j = 0; j < w; j++)
    for (i = 0; i < h; i++)
    {
        pDst[j][i] = pSrc[i][w - 1 - j];
    }
}

그림 9-24는 실제 영상을 90°, 180°, 270°에 대하여 회전한 결과의 예를 보여준다. 그림 9-24(a)는 입력 영상인 child.bmp 파일이다. 90°와 270° 회전에 대하여 가로, 세로 크기가 뒤바뀌는 것을 확인하기 위하여 가로, 세로 크기가 다른 영상을 사용하였다. child.bmp 영상의 가로 크기는 320픽셀이고, 세로 크기는 240픽셀이다. 그림 9-24(b)~(d)는 입력 영상을 각각 90°, 180°, 270° 크기만큼 회전한 결과를 보여준다.

그림 9-24 특수 각도에 대한 영상의 회전 변환 결과 예제
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.