ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Direct2D] ID2D1Effect : Edge detection
    C++/미분류 2024. 4. 17. 11:09

    D2D Effect는 이미지의 가장자리를 탐색하고, 그 위치에 선을 그리는 기능을 제공합니다.

    이번 글에서는 해당 기능을 이용하여 이미지의 가장자리를 탐색해보도록 하겠습니다.

     

    이번 글의 출력 결과는 지난 글의 코드에서 이어집니다.

    [Direct2D] ID2D1Effect 사용하기
    [Direct2D] ID2D1Effect : Color matrix
    Edge-detection effect - Win32 apps | Microsoft Learn

    또한, 위 MSDN에 기반하여 작성되었습니다.

     


     

    1. Effect 생성 및 초기화

     

    더보기

    D2D Effect는 Device context에 의해 초기화되며, 이 때 적용활 효과에 대한 ID를 사용합니다.

    Edge detection은 다음과 같이 초기화 할 수 있습니다.

    ComPtr<ID2D1Effect> edgeDetectionEffect;
    myDirect2dContext->CreateEffect(
        CLSID_D2D1EdgeDetection,
        &edgeDetectionEffect
    );

     

    초기화 된 Effect객체에 효과를 적용할 이미지를 지정합니다.

    ComPtr<ID2D1Bitmap> tmp = myCharacterBitmap->GetBitmap();
    if (tmp) {
        edgeDetectionEffect->SetInput(0, tmp.Get());
        ...
    }

     

    이번 글에서는 위 코드가 아닌, 이전 글에서 사용된 변환 효과에 Edge detection을 적용해보도록 하겠습니다.

    edgeDetectionEffect->SetInputEffect(0, affineTransformEffect.Get());

    SetInputEffect함수는 이미지가 아닌 효과를 추가하는 함수입니다.

    해당 함수를 사용할 경우, 지정한 효과에 추가적인 효과가 적용됩니다.

     

    2. 속성 적용하기

     

    더보기

    Edge detection은 아래와 같이 몇 가지의 속성을 적용할 수 있습니다.

    edgeDetectionEffect->SetValue(D2D1_EDGEDETECTION_PROP_STRENGTH, {});
    edgeDetectionEffect->SetValue(D2D1_EDGEDETECTION_PROP_BLUR_RADIUS, {});
    edgeDetectionEffect->SetValue(D2D1_EDGEDETECTION_PROP_MODE, {});
    edgeDetectionEffect->SetValue(D2D1_EDGEDETECTION_PROP_OVERLAY_EDGES, {});
    edgeDetectionEffect->SetValue(D2D1_EDGEDETECTION_PROP_ALPHA_MODE, {});

    D2D1_EDGEDETECTION_PROP_STRENGTH

      - 외곽선의 강도를 나타내는 값 입니다. 값이 커질수록 선이 두꺼워집니다.

      - 값의 허용 범위는 0.0 - 1.0이며, 기본값은 0.5입니다.

    D2D1_EDGEDETECTION_PROP_BLUR_RADIUS

      - 외곽선에 흐림 효과를 적용할 수 있는 속성입니다. 값이 커질수록 외곽선이 흐려집니다.

      - 값의 허용 범위는 0.0 - 10.0이며, 기본값은 0.0입니다.

    D2D1_EDGEDETECTION_PROP_MODE 

      - 외곽선 추출에 사용할 함수를 지정하는 속성입니다.

      - D2D1_EDGEDETECTION_MODE_SOBEL과 D2D1_EDGEDETECTION_MODE_PREWITT를 지정할 수 있습니다.

      - 기본값은 D2D1_EDGEDETECTION_MODE_SOBEL입니다.

    D2D1_EDGEDETECTION_PROP_OVERLAY_EDGES 

      - 출력 결과의 알파값에 대한 속성입니다.

      - bool값으로 지정할 수 있으며, false일 경우 입력 알파값이 보존되지 않으며, true일 경우 입력 알파값이 보존됩니다.

      - 기본값은 false입니다.

    D2D1_EDGEDETECTION_PROP_ALPHA_MODE 

      - 입력 이미지의 알파값 처리 방식에 대한 속성입니다.

      - 알파값은 RGB값에 미리 적용되어 RGB로 표현될 수도, 따로 존재하여 RGBA값으로 표현될 수도 있습니다.

      - 지정 가능한 값은 D2D1_ALPHA_MODE_{}의 값으로, UNKNOWN, PREMULTIPLIED, STRAIGHT, IGNORE이 있습니다.

      - 기본값은 PREMULTIPLIED입니다.

     

    위 값들은 기본 값이 있기 때문에, 코드에서 값을 지정하지 않아도 기본값을 통한 Edge detection이 수행됩니다.

     

    D2D1_EDGEDETECTION_PROP(d2d1effects_2.h) - Win32 apps | Microsoft Learn

    각각의 속성에 대한 상세한 내용은 상기 MSDN에 기술되어 있습니다.

     

    3. 출력하기

     

    더보기

    D2D Effect의 출력은 이전 글과 동일하게, DrawImage함수로 수행할 수 있습니다.

    myDirect2dContext->DrawImage(
        edgeDetectionEffect.Get(), 
        D2D1::Point2F(ps.x - 25.f, ps.y - 200.f));
    // Add
    myDirect2dContext->DrawImage(
        edgeDetectionEffect2.Get(), 
        D2D1::Point2F(ps.x - 25.f, ps.y - 70.f));
    myDirect2dContext->DrawImage(
        edgeDetectionEffect3.Get(), 
        D2D1::Point2F(ps.x - 25.f, ps.y + 60.f));

    이전 글의 여러 출력에 대응하는 Edge detection을 추가로 출력했습니다.

     


     

    본문의 내용을 따라, 이전 글에 이어서 Edge detection을 수행한 출력 결과는 다음과 같습니다.

    해당 출력에 대한 코드 전문은 아래 Github에서 확인하실 수 있습니다.

     

    GitHub - ruru14/WinapiStudy: WinAPI및 DirectX를 공부하며, 간단한 운동 법칙을 적용해봅니다.

    WinAPI및 DirectX를 공부하며, 간단한 운동 법칙을 적용해봅니다. Contribute to ruru14/WinapiStudy development by creating an account on GitHub.

    github.com

     

    이번 글이 도움이 되셨기를 바랍니다.

    감사합니다.

    댓글

Designed by Tistory.