더북(TheBook)

6.1.3 영상 반전 구현

영상의 반전 기능을 구현하기 전에 먼저 코드를 작성할 새로운 파일을 추가해보도록 하자. 앞으로 구현할 영상 처리 알고리즘이 한 두 개가 아니기 때문에 모든 코드를 하나의 파일에 구현하면 소스 코드 유지 보수가 복잡해진다. 그러므로 영상 처리 알고리즘의 성격에 따라 별도의 파일을 만들어 소스 코드를 추가하는 것이 좋다.

Visual Studio 메뉴에서 [프로젝트] > [새 항목 추가...]를 선택하고, 그림 6-4와 같이 새 항목 추가 대화 상자에서 그림 6-4와 같이 ‘헤더 파일(.h)’ 항목을 선택하자. 그리고 하단의 ‘이름’에는 IppEnhance.h라고 입력하자.

이때 IppEnhance.h 파일이 프로젝트 폴더 하위의 IppImage 폴더에 생성되도록 위치를 지정하고 [추가] 버튼을 클릭하자.

그림 6-4 새 항목 추가 대화 상자에서 IppEnhance.h 파일 추가

IppEnhance.h 파일이 추가되었으면 여기에 영상 반전을 위한 함수 선언을 추가하자. 소스 6-1은 IppEnhance.h 파일에 추가한 소스 코드의 내용을 보여준다.

소스 6-1 영상의 반전 함수의 선언(IppEnhance.h)
#pragma once

#include "IppImage.h"

void IppInverse(IppByteImage& img);

반전 함수의 이름은 IppInverse라고 지었으며, 인자로는 IppByteImage 객체를 참조 형태로 받는다. IppByteImage 클래스를 인자로 받기 때문에 이 함수는 오직 그레이스케일 영상만 반전할 수 있다. 만약 추후 컬러 영상에 대해서도 반전 기능을 추가하려면 IppRgbImage 클래스를 인자로 받는 IppInverse 함수를 재정의하면 된다. IppEnhance.h 파일의 맨 앞에는 #pragma once 구문을 추가하여 이 헤더 파일이 오직 한 번만 포함되도록 설정하였다. 그리고 IppInverse 함수에서 IppImage 클래스를 사용하고 있으므로 #include "IppImage.h" 문장을 추가해야 한다.

IppEnhance.h 파일에 IppInverse 함수를 선언하였으면 이제 이 함수의 본체 코드를 작성해보자. 이를 위해 다시 [프로젝트] > [새 항목 추가...] 메뉴를 이용하여 IppEnhance.cpp 소스 파일을 추가하자. IppEnhance.cpp 파일에 추가할 IppInverse 함수는 소스 6-2에 나타내었다.

소스 6-2 영상의 반전 함수(IppEnhance.cpp)
#include "stdafx.h"
#include "IppEnhance.h"

void IppInverse(IppByteImage& img)
{
    int size = img.GetSize();
    BYTE* p = img.GetPixels();

    for (int i = 0; i < size; i++)
    {
        p[i] = 255 - p[i];
    }
}

소스 6-2에 나타난 IppInverse 함수는 GetPixels 함수를 이용하여 img 영상의 픽셀 데이터를 1차원 배열처럼 접근하고 있다. 그리고 for 루프를 이용하여 영상의 모든 픽셀을 순회하면서 각각의 픽셀 값을 255에서 뺀 값으로 변경하였다. 코드가 그리 복잡하지 않으므로 쉽게 이해할 수 있을 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.