ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OpenCV 강좌 C++ & Python - 글자(문자열) 출력하는 putText 함수 사용방법
    OpenCV/OpenCV C++&Python 강좌 2019. 8. 11. 17:29



    OpenCV의  글자(문자열)을 출력하는 putText 함수를 C++과 Python에서 사용하는 방법을 설명합니다.



    2015.  1. 2 - 최초 작성

    2018.  7. 16 

    2019.  8. 11 - C++ 코드 추가




    문자열을 출력하는 예제 코드입니다. 


    Python


    import numpy as np
    import cv2 as cv

    img_w = 640
    img_h = 480
    bpp = 3

    img = np.zeros((img_h, img_w, bpp), np.uint8)


    red = (0, 0, 255)
    green = (0, 255, 0)
    blue = (255, 0, 0)
    white = (255, 255, 255)
    yellow = (0, 255, 255)
    cyan = (255, 255, 0)
    magenta = (255, 0, 255)


    center_x = int(img_w / 2.0)
    center_y = int(img_h / 2.0)


    thickness = 2

    location = (center_x - 200, center_y - 100)
    font = cv.FONT_HERSHEY_SCRIPT_SIMPLEX  # hand-writing style font
    fontScale = 3.5
    cv.putText(img, 'OpenCV', location, font, fontScale, yellow, thickness)



    location = (center_x - 150, center_y + 20)
    font = cv.FONT_ITALIC  # italic font
    fontScale = 2
    cv.putText(img, 'Tutorial', location, font, fontScale, red, thickness)



    location = (center_x - 250, center_y + 100)
    font = cv.FONT_HERSHEY_SIMPLEX  # normal size sans-serif font
    fontScale = 1.5
    cv.putText(img, 'webnautes.tistory.com', location, font, fontScale, blue, thickness)



    location = (center_x - 130, center_y + 150)
    font = cv.FONT_HERSHEY_COMPLEX  # normal size serif font
    fontScale = 1.2
    cv.putText(img, 'webnautes', location, font, fontScale, green, thickness)


    cv.imshow("drawing", img)
    cv.waitKey(0)



    C++


    #include <opencv2/opencv.hpp>


    using namespace cv;


    int main()
    {
    // 컬러 이미지를 저장할 Mat 개체를 생성합니다.
    int img_w = 640;
    int img_h = 480;

    Mat img(img_h, img_w, CV_8UC3, Scalar(0, 0, 0));


    Scalar red(0, 0, 255);
    Scalar green(0, 255, 0);
    Scalar blue(255, 0, 0);
    Scalar white(255, 255, 255);
    Scalar yellow(0, 255, 255);
    Scalar cyan(255, 255, 0);
    Scalar magenta(255, 0, 255);


    int center_x = int(img_w / 2.0);
    int center_y = int(img_h / 2.0);


    int thickness = 2;
    Point location(center_x - 200, center_y - 100);
    int font = FONT_HERSHEY_SCRIPT_SIMPLEX;// hand-writing style font
    double fontScale = 3.5;
    putText(img, "OpenCV", location, font, fontScale, yellow, thickness);



    location = Point(center_x - 150, center_y + 20);
    font = FONT_ITALIC; // italic font
    fontScale = 2;
    putText(img, "Tutorial", location, font, fontScale, red, thickness);



    location = Point(center_x - 250, center_y + 100);
    font = FONT_HERSHEY_SIMPLEX;  // normal size sans-serif font
    fontScale = 1.5;
    putText(img, "webnautes.tistory.com", location, font, fontScale, blue, thickness);



    location = Point(center_x - 130, center_y + 150);
    font = FONT_HERSHEY_COMPLEX; // normal size serif font
    fontScale = 1.2;
    putText(img, "webnautes", location, font, fontScale, green, thickness);


    imshow("drawing", img);
    waitKey(0);



    return 0;
    }




    실행시켜보면 폰트와 글자색을 다르게한 4개의 문자열을 출력합니다.





    이제 코드를 설명합니다.



    1. 모든 픽셀값이 0으로 초기화된 이미지를 생성하여 여기에 원을 그립니다. 자세한 설명은  첫번째 포스팅을 참고하세요.  


    img = np.zeros((height, width, bpp), np.uint8)




    2. 포스팅 작성 편리를 위해 색깔별로 튜플 객체를 생성해두었습니다.  

    튜플의 값은 ( blue, green. red) 순으로 입력해야 합니다. 


    red = (0,0,255)
    green = (0,255,0)
    blue = (255,0,0)
    white = (255,255,255)
    yellow = (0,255,255)
    cyan = (255, 255, 0)
    magenta = (255, 0, 255)




    3.  cv.putText 함수는  이미지(ndarray 객체) img에  글자(문자열)을 그립니다. 

    아규먼트는 다음과 같습니다. (노란색 아규먼트들은 생략가능합니다.)


    img = cv.putText(

                            img,   문자열을 그릴 이미지

                           text,   문자열             

                            org,   문자열의 왼쪽아래 좌표

                       fontFace,   폰트 타입

                      fontScale,   폰트 기본 크기에 곱해질 폰트 스케일 팩터(Font scale factor)

                          color,   글자 색

                      thickness,   디폴트값 1

                       lineType,   디폴트값 cv.LINE_8(=8-connected line)

               bottomLeftOrigin)   디폴트값 false




    4. cv.putText 함수에 바로 적어도 되지만 설명 편의상 변수를 사용했습니다.


    글자 선의 굵기를 2로 고정합니다.


    thickness = 2



    문자열이 출력될 위치를 지정합니다. 문자열이 출력되면 가상으로 그려볼 수 있는 사각형 왼쪽 아래 좌표에 해당됩니다. 


    location = (center_x - 200, center_y - 100)



    문자열의 폰트를 필기체로 폰트 크기는 디폴트 폰트 크기(fontScale=1)의 3.5배로 지정합니다. 


    font = cv.FONT_HERSHEY_SCRIPT_SIMPLEX 
    fontScale = 3.5



    cv.putText 함수를 사용하여 이미지 img에 OpenCV 문자열을 노란색으로 출력합니다. 


    cv.putText(img, 'OpenCV', location, font, fontScale, yellow, thickness)



    참고로 OpenCV에서 사용할 수 있는 폰트 리스트입니다. Python이라고 언급된 상수를 사용해야 합니다. 


    출처 - https://docs.opencv.org/3.4.2/d0/de1/group__core.html#ga0f9314ea6e35f99bb23f29567fc16e11


    Enumerator

    FONT_HERSHEY_SIMPLEX 

    Python: cv.FONT_HERSHEY_SIMPLEX

    normal size sans-serif font

    FONT_HERSHEY_PLAIN 

    Python: cv.FONT_HERSHEY_PLAIN

    small size sans-serif font

    FONT_HERSHEY_DUPLEX 

    Python: cv.FONT_HERSHEY_DUPLEX

    normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)

    FONT_HERSHEY_COMPLEX 

    Python: cv.FONT_HERSHEY_COMPLEX

    normal size serif font

    FONT_HERSHEY_TRIPLEX 

    Python: cv.FONT_HERSHEY_TRIPLEX

    normal size serif font (more complex than FONT_HERSHEY_COMPLEX)

    FONT_HERSHEY_COMPLEX_SMALL 

    Python: cv.FONT_HERSHEY_COMPLEX_SMALL

    smaller version of FONT_HERSHEY_COMPLEX

    FONT_HERSHEY_SCRIPT_SIMPLEX 

    Python: cv.FONT_HERSHEY_SCRIPT_SIMPLEX

    hand-writing style font

    FONT_HERSHEY_SCRIPT_COMPLEX 

    Python: cv.FONT_HERSHEY_SCRIPT_COMPLEX

    more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX

    FONT_ITALIC 

    Python: cv.FONT_ITALIC

    flag for italic font




    5. 폰트가 출력될 위치 지정(왼쪽 아래 좌표), 폰트, 폰트 스케일 팩터, 폰트 색등을 다르게 하여 문자열들을 출력합니다.  


    location = (center_x - 150, center_y + 20)
    font = cv.FONT_ITALIC  # italic font
    fontScale = 2
    cv.putText(img, 'Tutorial', location, font, fontScale, red, thickness)



    location = (center_x - 250, center_y + 100)
    font = cv.FONT_HERSHEY_SIMPLEX  # normal size sans-serif font
    fontScale = 1.5
    cv.putText(img, 'webnautes.tistory.com', location, font, fontScale, blue, thickness)



    location = (center_x - 130, center_y + 150)
    font = cv.FONT_HERSHEY_COMPLEX  # normal size serif font
    fontScale = 1.2
    cv.putText(img, 'webnautes', location, font, fontScale, green, thickness)




    6. 이제 윈도우 창 “drawing”에 이미지 img를 보여줍니다. 

    이후 waitKey 함수의 아규먼트가 0이기 때문에 사용자가 키보드를 누르기 전까지 대기합니다. 


    cv.imshow("drawing", img)

    cv.waitKey(0);




    포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
    댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

    여러분의 응원으로 좋은 컨텐츠가 만들어집니다. 지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

    유튜브 구독하기


    댓글 0

Designed by Tistory.