개발

[개발] OpenCV 감마 조절

노트북 산 김에 공부 2023. 4. 25. 20:14

웹 캠에서 영상을 받아오고, 실시간으로 사용자가 'u' (up) , 'd' (down) 버튼으로 감마를 조절할 수 있는 코드를 작성하겠습니다. 


import cv2 as cv
import numpy as np

나중에 gamma 조절 함수의 반환값으로 np.uint8 타입을 써야하므로 numpy를 임포트합니다

gammaValue = 1.0 # 감마 기본값 초기화

이번 개발중 가장 오류가 많이 생긴 이유이자. 가장 기본적인 초기화를 (while 밖에) 해 줍니다.

만일 while문 안에 초기화 시키면 매초마다 frame을 읽어올 때 gammValue도 초기화 되기에 u, d으로 감마를 조정해도

다음 프레임부터는 1.0 감마로 출력되게 됩니다.

while True:
    global gammaValue # 감마 초기값 전역변수 설정
    
    ret, frame = cap.read()
    if not ret:
        break
    
    key = cv.waitKey(1)
    if key == ord('q'):
        break
    if key == ord('u'):  # u 입력
        gammaValue += 0.5
    elif key == ord('d'): # d 입력
        gammaValue -= 0.5 
    
    def gamma(f, gammaValue=1.0):    # 감마 조절 알고리즘
        f1 = f / 255.0
        return np.uint8(255*(f1**gammaValue)) 
    
    live = gamma(frame, gammaValue)
    

    cv.imshow('gamma', live)
        
    
cap.release()
cv.destroyAllWindows()

위 공식을 구현한 gamma 함수를 사용해 매 프레임 마다 감마값 (미리 정의된 감마값) 으로 출력되게 됩니다. 

 

재밌는건 감마가 0보다 작아지면 색 공간이 HSV(?) 처럼 변한다는 것입니다.

그러나 계속 d을 누르면 변화폭이 점점 작아집니다.