728x90
# 1) 필요한 모듈 임포트
import cv2 as cv
import numpy as np

# 프로그램 1
# Blur Detection Simulator
# 2) 영상 읽음
img = cv.imread('data/imageTextN.jpg')
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
img = img/255

# 3) 블러링 기준 정함 (시그마 0.8일 때 기준으로 함)
min_blur = cv.GaussianBlur(src=img, ksize=(21, 21), sigmaX=0.8)

# 푸리에 변환
min_f = np.fft.fft2(min_blur)

# 스펙트럼
min_fshift = np.fft.fftshift(min_f)

# 스펙트럼 합 구함 (블러링 기준으로 정함)
scale = 0.3
min_spect = scale * np.log10(np.abs(min_fshift) + 1)       # 스펙트럼 스케일링
min_spect_clip = np.clip(min_spect, 0, 1)                  # 0~1으로 클립핑
min_hap = np.sum(min_spect_clip) / (min_spect_clip.shape[0] * min_spect_clip.shape[1])


# 5) 시그마 트랙바 값 변경 시 호출되는 함수
def onChangeSigma(sigma):
    if sigma >0 :
        blur = cv.GaussianBlur(src=img, ksize=(21, 21), sigmaX=(sigma*0.1))    # 블러링 시킴

        # 푸리에 변환
        blur_f = np.fft.fft2(blur)

        # 스펙트럼 합 구함
        blur_fshift = np.fft.fftshift(blur_f)
        scale = 0.3
        blur_spect = scale * np.log10(np.abs(blur_fshift) + 1)
        blur_spect_clip = np.clip(blur_spect, 0, 1)
        blurry = np.sum(blur_spect_clip)/(blur_spect_clip.shape[0]*blur_spect_clip.shape[1])

        # 블러링 검출
        if blurry <= min_hap:                      # 스펙트럼 합이 기준 값 이하이면 Blurry 출력
            print('blurry', blurry-min_hap)
        else:                                      # 기준 값 초과하면 Not Blurry 출력
            print('not blurry', blurry-min_hap)

        cv.setWindowTitle('Blur Trackbar', 'Blur Trackbar')
        cv.imshow('Blur Trackbar', np.hstack((blur, blur_spect_clip)))


# 4) 시그마 값 조절할 트랙바 생성
cv.namedWindow('Blur Trackbar')                 # 트랙바 조절할 새로운 창 염
cv.imshow('Blur Trackbar', img)                 # 원본 영상 화면에 출력
cv.createTrackbar('sigma', 'Blur Trackbar', 0, 50, onChangeSigma)   # 시그마 0.0 ~ 5.0 까지 조절 가능

# 6) 윈도우 창 종료
cv.waitKey(0)
cv.destroyWindow('Blur Trackbar')



# 프로그램 2
# Real time Video Detector

# 2) 블러링 검출 함수
def blurNotblur(cam):
    # 비디오 영상을 gray로 변환
    cam_gray = cv.cvtColor(cam, cv.COLOR_BGR2GRAY)

    # 푸리에 변환
    f = np.fft.fft2(cam_gray)

    # 스펙트럼 합 구함
    fshift = np.fft.fftshift(f)
    spect = scale * np.log10(np.abs(fshift) + 1)
    spect_clip = np.clip(spect, 0, 1)
    blurry = np.sum(spect_clip) / (spect_clip.shape[0] * spect_clip.shape[1])

    # 블러링 검출
    if blurry < 0.94 :   # 기준 값 (0.94) 임의로 지정함
        cv.putText(cam,'Blurry'+str(blurry-0.94), (0,100), 0, 1, (0,0,255))          # 블러링 검출되면 Blurry 출력
    else:
        cv.putText(cam,'Not Blurry'+str(blurry-0.94), (0,100), 0, 1, (255,0,0))      # 아니면 Not Blurry 출력
    cv.imshow('Blurry/Not Blurry', cam)      # 화면에 영상과 블러링 검출 텍스트 출력


# 1) 비디오 영상 읽음
video = cv.VideoCapture(1, cv.CAP_DSHOW)        # 비디오 객체 생성

while (True):
    k = cv.waitKey(100)
    if k == 27:    # esc 키를 누르면 종료
        break

    ret, cam = video.read()          # 비디오 영상 읽음
    blurNotblur(cam)                 # 블러링 검출 함수 실행

video.release()
cv.destroyAllWindows()

- 푸리에 변환을 이용하여 영상의 블러링의 정도를 검출하는 프로그램

 

1. Blur Detection Simulator

- 시그마를 제어하는 트랙 바를 만들고 스펙트럼의 합에 따라 Blurry/Not Blurry를 지정

 

# 영상 읽음

- ‘imageTextN.jpg’영상을 흑백으로 읽음

 

# 블러링 기준 정함 (시그마 0.8일 때 기준으로 함)

- 시그마를 0.8로 해서 블러링 시킨 영상을 푸리에 변환시켜 스펙트럼의 합을 구함

- 그 합(min_hap)을 블러링 기준으로 정함 (이하이면 Blurry, 초과하면 Not Blurry)

- 스펙트럼을 적절한 값으로 스케일링시킨 후 0~1으로 클립핑 시킴

- 기준 값 : 0.2639913116290358

 

# 시그마 트랙 바 값 변경 시 호출되는 함수

- 트랙바로 시그마 값을 변경하면 시그마 값 * 0.1으로 영상을 블러링 시킴

- 시그마가 0인 경우에는 원본 영상(블러링 안 시킴))

- 그 영상에 푸리에 변환을 하여 스펙트럼의 합을 구함

- 그 합이 기준 값(시그마 0.8일 때의 스펙트럼의 합) 이하이면 Blurry로 판단

- 그 합이 기준 값 초과하면 Not Blurry로 판단

- 콘솔 창에 블러링 유무와 블러링 정도를 출력

- 블러링 정도는 (기준 값 스펙트럼의 합)으로 수치화함

- 블러링이 심할수록 값 작음(마이너스로)

 

# 실행 결과

- 트랙 바로 시그마 조절에 따른 결과

- 시그마가 8 미만이면 not blurry 와 블러링 정도 출력

- 시그마가 8 이상이면 blurry 와 블러링 정도 출력

 

2. Real time Video Detector

- 비디오 카메라에 blur detector를 적용한 데모용 동영상을 제작

- 캠 카메라의 영상을 화면에 보이고 블러링을 판단하여 Blurry/Not Blurry를 글자색을 바꾸어 출력하고 블러링 정도를 수치화하여 표현

 

# 블러링 검출 함수

- 비디오 영상을 gray로 읽어 푸리에 변환을 한 후 스펙트럼의 합을 구함

- 그 합이 기준 값(0.94-관찰 후 지정하였음) 미만이면 파란색 글씨로 영상에 ‘Blurry’ 텍스트와 블러링 정도 출력

- 그 합이 기준 값 이상이면 빨간색 글씨로 영상에 ‘Not Blurry’ 텍스트와 블러링 정도 출력

- 블러링 정도는 (영상의 스펙트럼의 합 기준 값) 으로 수치화함

- 블러링이 심할수록 값 작음(마이너스로)

 

# 실행 결과

- 핸드폰 카메라를iVCam을 이용하여 연결하였음

 

1. Not Blurry 한 경우

- 파란 글씨로 ‘Not Blurry’ 와 블러링 정도 출력

 

2. Blurry 한 경우

- 빨간 글씨로 ‘Not Blurry’ 와 블러링 정도 출력

 

# 느낀 점

카메라를 직접 연결하는 것이 처음이라 버벅거렸지만 사용해보니 신기했음. 처음에 노트북 내장 카메라로 하려고 하니 카메라를 움직이는 것이 힘들어서 핸드폰에 iVCam 이라는 앱을 깔아 핸드폰 카메라로 연동시켜보니 카메라를 움직이는 것이 수월해졌음.

블러링 기준 값을 정하기 위해서 계속 카메라를 움직여보고 물체도 움직여보다가 카메라를 움직였을 때 초점이 안 맞는 것을 발견함. 카메라가 초점을 잘 맞추는 것을 깨닫게 됨.

대면 수업이었으면 수업 시간에 카메라를 이용해서 많은 경험을 해봤을 것으로 예상되어 조금 아쉬움. 혼자서 어려웠지만 신기한 경험이었음. 동기들과 같이 카메라를 연결해서 하는 프로그램을 작성하면 좋은 경험이 될 것 같다고 느낌.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기