chapter 5. 그리기 관련 함수들…

이번에는 간단한 그리기 함수들을 알아보도록 하겠습니다.

Drwing line, 선 그리기

이미지에 선을 그리기 위해서는 Line()함수를 사용합니다. Line() 함수는 아래와 같이 2개의 오버로드가 있습니다. 좌표데이터(x위치, y위치)를 int로 지정하거나, point로 하거나의 차이 입니다.

  • Cv2.Line(InputOutputArray, Point, Point, Scalar, Int32, LineTypes, Int32)
  • Cv2.Line(InputOutputArray, Int32, Int32, Int32, Int32, Scalar, Int32, LineTypes, Int32)

함수 내용은 아래와 같습니다. Drawing Line

예제 코드

//drawing line        
{
    Mat img = new Mat(500, 500, MatType.CV_8UC3);

    //red, thick3, antialias
    Cv2.Line(img, (Point)new Point2d(100, 100), (Point)new Point2d(400, 105), Scalar.Red, 3, LineTypes.AntiAlias);
    //green, thick5, link4
    Cv2.Line(img, (Point)new Point2d(100, 200), (Point)new Point2d(400, 205), Scalar.Green, 5, LineTypes.Link4);
    //blue, thick10, link8
    Cv2.Line(img, (Point)new Point2d(100, 300), (Point)new Point2d(400, 305), Scalar.Blue, 10, LineTypes.Link8);

    using (new Window("Draw Line", img))
    {
        Cv2.WaitKey();
        Cv2.DestroyAllWindows();
    }
}

결과 Drawing Line

drawing ractangle, 사각형 그리기

이미지에 사각형을 그리기 위해서 Rectangle( )함수를 사용합니다. Rectangle() 함수는 4개의 오버로드가 있습니다.

  • Rectangle(InputOutputArray, Rect, Scalar, Int32, LineTypes, Int32)
  • Rectangle(Mat, Rect, Scalar, Int32, LineTypes, Int32)
  • Rectangle(InputOutputArray, Point, Point, Scalar, Int32, LineTypes, Int32)
  • Rectangle(Mat, Point, Point, Scalar, Int32, LineTypes, Int32)

그중에 마지막 함수형을 알아보겠습니다. Drawing rectangle

예제 코드

//drawing ractangle
{
    Mat img = new Mat(500, 500, MatType.CV_8UC3);

    //red, thick3, link4
    Cv2.Rectangle(img, (Point)new Point2d(200, 50), (Point)new Point2d(300, 150), Scalar.Red, 3, LineTypes.Link4);
    //green, thick5, link8
    Cv2.Rectangle(img, (Point)new Point2d(200, 200), (Point)new Point2d(300, 300), Scalar.Green, 5, LineTypes.Link8);
    //blue, thick-1(fill), Antialias
    Cv2.Rectangle(img, (Point)new Point2d(200, 350), (Point)new Point2d(300, 450), Scalar.Blue, -1, LineTypes.AntiAlias);

    using (new Window("Draw Ractangle", img))
    {
        Cv2.WaitKey();
        Cv2.DestroyAllWindows();
    }
}

결과 Drawing rectangle

Drawing Circle, 원 그리기

이미지에 원을 그리기 위해서 Circle()함수를 사용합니다. Circle() 함수는 2개의 오버로드가 있습니다.

  • Circle(InputOutputArray, Point, Int32, Scalar, Int32, LineTypes, Int32)
  • Circle(InputOutputArray, Int32, Int32, Int32, Scalar, Int32, LineTypes, Int32)

그중에 Point를 사용하는 함수형을 알아보겠습니다. 함수 인자로 원의 중심좌료, 반지름, 색상, 선두께, 선종류를 받습니다. Drawing circle

예제 코드

//drawing circle
{
    Mat img = new Mat(500, 500, MatType.CV_8UC3);

    //red - circle(이미지, 원의 중심 좌표, 반지름, 색상, 선두께, 선종류)
    Cv2.Circle(img, (Point)new Point2d(300, 100), 100, Scalar.Red, 3, LineTypes.Link4);
    //green
    Cv2.Circle(img, (Point)new Point2d(200, 250), 120, Scalar.Green, 8, LineTypes.Link8);
    //blue
    Cv2.Circle(img, (Point)new Point2d(300, 400), 80, Scalar.Blue, -1, LineTypes.AntiAlias);

    using (new Window("Draw Circle", img))
    {
        Cv2.WaitKey();
        Cv2.DestroyAllWindows();
    }
}

결과 Drawing circle

Drawing ellipse, 타원형 그리기

이미지에 타원형을 그리기 위해서 ellipse()함수를 사용합니다. ellipse() 함수는 2개의 오버로드가 있습니다.

  • Ellipse(InputOutputArray, RotatedRect, Scalar, Int32, LineTypes)
  • Ellipse(InputOutputArray, Point, Size, Double, Double, Double, Scalar, Int32, LineTypes, Int32)

그중에 Point를 사용하는 함수형을 알아보겠습니다. 함수인자로 원의 중심좌료, 회전각도, 호시작각도, 호종료각도, 색상, 선두께, 선종류를 받습니다. Drawing ellipse

예제 코드

//drawing ellipse
{
    Mat img = new Mat(500, 500, MatType.CV_8UC3);
    double angle;

    //ellipse (이미지, 중심좌표 (장경·단경), 회전각도, 호 시작각도, 호 종료각도, 색상, 선두께, 선종류)
    //red, thick3, link4
    angle = 30;
    Cv2.Ellipse(img, (Point)new Point2d(400, 150), (Size)new Size(200, 100), angle, angle - 100, angle + 200, Scalar.Red, 3, LineTypes.Link4);

    //green, thick5, link8
    angle = 0;
    Cv2.Ellipse(img, (Point)new Point2d(200, 200), (Size)new Size(100, 100), angle, angle, angle + 360, Scalar.Green, 5, LineTypes.Link8);

    //blue, thick-1, antialias
    angle = 100;
    Cv2.Ellipse(img, (Point)new Point2d(200, 400), (Size)new Size(100, 200), angle, angle - 200, angle + 100, Scalar.Blue, -1, LineTypes.AntiAlias);

    using (new Window("Draw Ellipse", img))
    {
        Cv2.WaitKey();
        Cv2.DestroyAllWindows();
    }
}

결과 Drawing ellipse

이상으로 간략히 그리기 함수를 알아보았습니다. 마지막으로 글자 쓰기를 알아보겠습니다.

Drawing Text, 문자 쓰기

문자를 쓰기 위해서는 Font를 사용합니다. 먼저 OpenCV에서 사용하는 Font를 알아보겠습니다. 기본적으로 HersheyFonts 가 있습니다. 종류는 아래와 같습니다.

public enum HersheyFonts
{
    HersheySimplex = 0,         //normal size sans-serif font        
    HersheyPlain = 1,           //small size sans-serif font
    HersheyDuplex = 2,          //normal size sans-serif font (more complex than HERSHEY_SIMPLEX)
    HersheyComplex = 3,         //normal size serif font
    HersheyTriplex = 4,         //normal size serif font (more complex than HERSHEY_COMPLEX)            
    HersheyComplexSmall = 5,    //smaller version of HERSHEY_COMPLEX            
    HersheyScriptSimplex = 6,   //hand-writing style font            
    HersheyScriptComplex = 7,   //more complex variant of HERSHEY_SCRIPT_SIMPLEX            
    Italic = 16                 //flag for italic font
}

OpenCV에서 글자를 쓰기위해서는 PutText() 함수를 사용합니다. 함수 내용은 아래와 같습니다. Drawing ellipse

예제 코드

//drawing text
{
    #region fonts
    //public enum HersheyFonts
    //{
    //    HersheySimplex = 0,         //normal size sans-serif font        
    //    HersheyPlain = 1,           //small size sans-serif font
    //    HersheyDuplex = 2,          //normal size sans-serif font (more complex than HERSHEY_SIMPLEX)
    //    HersheyComplex = 3,         //normal size serif font
    //    HersheyTriplex = 4,         //normal size serif font (more complex than HERSHEY_COMPLEX)            
    //    HersheyComplexSmall = 5,    //smaller version of HERSHEY_COMPLEX            
    //    HersheyScriptSimplex = 6,   //hand-writing style font            
    //    HersheyScriptComplex = 7,   //more complex variant of HERSHEY_SCRIPT_SIMPLEX            
    //    Italic = 16                 //flag for italic font
    //}
    #endregion

    Mat img = new Mat(500, 500, MatType.CV_8UC3);

    // 텍스트, 위치(좌표), 글꼴, 크기, 색상, 두께(옵션), 종류(옵션)
    img.PutText("OpenCV", (Point)new Point(50, 50), HersheyFonts.HersheySimplex, 0.5, Scalar.Red, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(50, 100), HersheyFonts.HersheyPlain, 0.5, Scalar.Orange, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(50, 150), HersheyFonts.HersheyDuplex, 0.5, Scalar.Green, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(50, 200), HersheyFonts.HersheyComplex, 0.5, Scalar.Yellow, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(50, 250), HersheyFonts.HersheyTriplex, 0.5, Scalar.White, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(50, 300), HersheyFonts.HersheyComplexSmall, 0.5, Scalar.SkyBlue, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(50, 350), HersheyFonts.HersheyScriptSimplex, 0.5, Scalar.SeaGreen, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(50, 400), HersheyFonts.HersheyScriptComplex, 0.5, Scalar.Pink, 1, LineTypes.AntiAlias);

    img.PutText("OpenCV", (Point)new Point(300, 50), HersheyFonts.Italic | HersheyFonts.HersheySimplex, 0.5, Scalar.Red, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(300, 100), HersheyFonts.Italic | HersheyFonts.HersheyPlain, 0.5, Scalar.Orange, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(300, 150), HersheyFonts.Italic | HersheyFonts.HersheyDuplex, 0.5, Scalar.Green, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(300, 200), HersheyFonts.Italic | HersheyFonts.HersheyComplex, 0.5, Scalar.Yellow, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(300, 250), HersheyFonts.Italic | HersheyFonts.HersheyTriplex, 0.5, Scalar.White, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(300, 300), HersheyFonts.Italic | HersheyFonts.HersheyComplexSmall, 0.5, Scalar.SkyBlue, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(300, 350), HersheyFonts.Italic | HersheyFonts.HersheyScriptSimplex, 0.5, Scalar.SeaGreen, 1, LineTypes.AntiAlias);
    img.PutText("OpenCV", (Point)new Point(300, 400), HersheyFonts.Italic | HersheyFonts.HersheyScriptComplex, 0.5, Scalar.Pink, 1, LineTypes.AntiAlias);


    using (new Window("Draw Text", img))
    {
        Cv2.WaitKey();
        Cv2.DestroyAllWindows();
    }
}

결과 Drawing ellipse

마지막으로 문자 그리기 까지 알아보았습니다.

Leave a comment