본문 바로가기
인공지능 기초

컴퓨터 비전 cv2.putText 활용 하여 label과 score 글씨 출력하기.

by SwMaker_Jun 2023. 5. 25.
728x90
반응형

1. cv2.putText()  함수

    cv2.putText() 함수는 OpenCV 라이브러리에서 제공하는 이미지에 텍스트를 추가하는 함수입니다.

   이미지 및 웹캠에서 불러온 창에 원하는 텍스트를 삽입하여 시각적인 표시나 설명을 할 수 있습니다.

   cv2.putText() 함수를 사용하여 텍스트를 이미지에 추가할 때는 다음과 같은 형식을 따릅니다

 

    cv2.putText(image, text, org, fontFace, fontScale, color, thickness, lineType)

 

  여기서 각 매개변수의 역할은 다음과 같습니다:

 

  image : 텍스트를 추가할 이미지입니다.

  text : 추가할 텍스트 내용입니다 (자료형이 텍스트 형태여야만 한다)

  org : 텍스트의 왼쪽 아래 모서리의 좌표입니다. (x, y) 형태의 튜플로 지정됩니다.

  fontFace : 텍스트의 글꼴입니다. OpenCV에서는 여러 글꼴을 지원합니다.

                    cv2.FONT_HERSHEY_XXX 상수를 사용하여   선택할 수 있습니다.

  fontScale : 텍스트의 크기 배율입니다.

  color : 텍스트의 색상입니다. (B, G, R) 형태의 튜플로 지정됩니다.

  thickness (선택적) : 텍스트의 두께입니다. 기본값은 1입니다.

  lineType (선택적) : 텍스트의 선 타입입니다. 기본값은 cv2.LINE_AA로 안티앨리어싱이 적용된 안티앨리어스 선입니다.

           

 

 예를 들어, 아래 코드는 웹캠에서 "Hello, OpenCV!"라는 텍스트를 삽입하는 예제입니다

웹캠을 열어서 hello opencv! 글씨 출력하기.

 

 

아래 - 파이썬 코드 복사 사용 

import cv2

# 웹캠 초기화
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

while True:
    ret, frame = cap.read()

    # 텍스트 추가
    text = "Hello, OpenCV!"
    org = (50, 50)
    fontFace = cv2.FONT_HERSHEY_SIMPLEX
    fontScale = 1
    color = (255, 0, 0)
    thickness = 2
    lineType = cv2.LINE_AA

    cv2.putText(frame, text, org, fontFace, fontScale, color, thickness, lineType)

    # 프레임 보여주기
    cv2.imshow("Webcam", frame)

    # 'q' 키를 누르면 종료
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 리소스 해제
cap.release()
cv2.destroyAllWindows()

 

 

 

 

org x,y 좌표 50/50으로 파란색 기본 글씨 출력

 

                               ※ 해보기  :    hello opencv 글씨를 다른색과 다른 위치로 바꿔서 출력해보자.

 

 

2. 티처블머신 모델 cv2.put.Text()  함수 활용하기.

 

https://swmakerjun.tistory.com/46

 

티처블머신(Teachable Machine) 모델 파이썬 openCV로 불러오기

1. 아나콘다 가상환경에 티처블머신 모델 옴기기 - 아나콘다에서 설정한 가상환경 폴더로 이동하여 새폴더 만들기 - 전내용에서 티처블머신으로 만든 가위, 바위, 보 모델 파일을 압축을 풀어 가

swmakerjun.tistory.com

 이 전 글에서 티처블머신 모델을 불러와 출력하는 코드를 복사하여 아래와 같이 수정해 보도록 하자.

 가상환경에서 주피터노트북 실행후 코드 수정

 

 

1. print 문을 찾아 이부분을 삭제

class_name 즉 label과 score를 주피터 창에 출력해는 코드

 

2. 조건문 70 이상일때만 관련 label  명과 score 점수 출력하기 위한 putText 함수 활용하는 코드 입력.

70% 이상인 label 명과 score 점수 CV함수 활용하여 텍스트 출력

 

위 내용만 수정하고 실행하면 

cv2.imshow() 함수가 실패하고 "Assertion failed" 오류가 발생한다.

 

putText() 함수를 사용하면서 일반적으로 이미지 또는 프레임의 속성에 문제가 있는 경우에 발생하는데 

 

대부분 웹캠의 프레임 크기 확인이 되지 않을때 이다.

 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 224)와

 cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 224)

 함수 명령어를 사용하여 웹캠의 프레임 크기를 올바르게 선언하고

 웹캠의 해상도에 따라 다른 값을 설정해야 할 수도 있다.

 

 

3. 결과 확인

putText() 함수로 웹캠에서 글씨 출력확인

 

영상으로 결과 확인해보자.

 

 

   위 코드 중에서 class_name[ 2 : -1 ] 은 class_name 리스트 자료형에서 슬라이싱 앞에  label 번호와 띄어쓰기는

   제외하고  label 명만 따오는 명령어 이다.

 

 

   위 화면과 같이 글씨 출력이 되었다면 이제 본인이 원하는 위치와 글씨 타입, 크기, 색상을 코드로 수정해 보자 !

 

from keras.models import load_model
import cv2
import numpy as np

model = load_model("keras_Model.h5", compile=False)
class_names = open("labels.txt", "r").readlines()

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 224)  
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 224)

while True:
    ret, frame = cap.read()
    frame = cv2.resize(frame, (224, 224), interpolation=cv2.INTER_AREA)
    image = np.asarray(frame, dtype=np.float32).reshape(1, 224, 224, 3)
    image = (image / 127.5) - 1
    prediction = model.predict(image)
    index = np.argmax(prediction)
    class_name = class_names[index]
    confidence_score = prediction[0][index]

    if confidence_score >= 0.7:
        label = class_name[2 : -1]
        score = np.round(confidence_score * 100)
        text = f"{label}: {score}%"
        cv2.putText(frame, text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)

    cv2.imshow("Webcam Image", frame)
    key = cv2.waitKey(1)

    if key == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

 

728x90
반응형