Schoolwork/컴퓨터그래픽스 및 비젼

[Python] 05주차 과제 - Canny Edge 검출

FATKITTY 2020. 9. 5. 14:17
반응형

 목적:

- 이 과제에서는 웹캠의 live 입력 영상에 대하여 에지 검출을 실행하여 결과를 보여준다.

 

 기타:

- 주요한 과정에 대하여 opencv, numpy 등 package 함수를 사용해도 무방합니다.

- 필요한 경우 각 단계에서 *적절한* 최적화 가 필요합니다. 여러분의 최적화 노력을 PPT 에 간략하게 설명하기 바랍니다.

- 기타 세부적인 사항은 합리적으로 가정하시기 바랍니다.

- OpenCV 에서는 여러 대의 카메라를 동시에 사용할 수 있습니다. 단, 0번 카메라로부터 영상을 live feed 받는 것을 원칙으로 합니다.  

- 영상에 대하여 적절한 해상도를 선택하세요. 고해상도일수록 처리 속도가 느려집니다.

- 이 프로그램은 여러분이 최적화한 파라미터값으로 진행되는 것을 원칙으로 합니다.

 

 과제의 내용

1. 과제의 내용:

A. 아래와 같이 webcam live-feed에 대하여 canny edge detection의 결과를 보여 주도록 한다.

B. 영상을 멈추지 않고 계속 보여주면서 Track bar를 사용하여 canny 함수의 threshold1 과 threshold 2를 변경할 수 있게 해 줍니다.

C. Space bar 를 누르면 프로그램 종료

윈도우
웹캠으로 부터의 live feed 를 연속적으로 디스플레이 함 에지 검출 결과를 디스플레이 함

 

2. 아래의 영상에 대하여 다음 질문에 답하세요.

A. 위 영상의 화소 100 위치에서 Prewitt 마스크로 convolution 하여 그라디언트 벡터를 계산하시오. 아래의 Prewitt 마스크 참조 바랍니다.

B. 100 위치의 에지 강도를 구하세요.

C. 그라디언트의 방향은 몇도 인지 계산하고 위 그림으로부터 추측할 수 있는 에지의 방향과 어떠한 관계인지 설명하세요.

D. 이 문제의 풀이도 PPT에 포함시키세요.

과제내용

Code

import cv2
import numpy as np

video = cv2.VideoCapture(0)  # 카메라 생성, 0번 카메라로 live feed 받기
# 비디오 캡쳐 객체가 정상적으로 open 되었는지 확인
if video.isOpened():
    print('width: {}, height : {}'.format(video.get(3), video.get(4)))

cv2.namedWindow('Canny Edge', 0)

# 트랙바를 조절할 때마다 실행할 명령이 따로 없으므로 dummy 함수를 하나 만들어준다.
def nothing(x):
    pass

# Canny Edge window에 0~255 임계값 조절 trackbar 두 개
cv2.createTrackbar('threshold 1', 'Canny Edge', 0, 500, nothing)  # 트랙바 생성, 조정 범위는 0~500
cv2.createTrackbar('threshold 2', 'Canny Edge', 0, 500, nothing)
cv2.setTrackbarPos('threshold 1', 'Canny Edge', 50)  # 트랙바의 초기값 지정
cv2.setTrackbarPos('threshold 2', 'Canny Edge', 200)

# 가로 세로 각 배수씩 더 크게 검정색 이미지를 생성
def create_image_multiple(h, w, d, hcout, wcout):
    image = np.zeros((h*hcout, w*wcout,  d), np.uint8)
    color = tuple(reversed((0, 0, 0)))
    image[:] = color
    return image

# 통이미지 하나에 원하는 위치로 복사(표시)
# dst는 create_image_multiple 함수에서 만든 통이미지, src는 복사할 이미지
def showMultiImage(dst, src, h, w, d, col, row):
    # 3 color
    if d == 3:
        dst[(col*h):(col*h)+h, (row*w):(row*w)+w] = src[0:h, 0:w]
    # 1 color
    elif d == 1:
        dst[(col*h):(col*h)+h, (row*w):(row*w)+w, 0] = src[0:h, 0:w]
        dst[(col*h):(col*h)+h, (row*w):(row*w)+w, 1] = src[0:h, 0:w]
        dst[(col*h):(col*h)+h, (row*w):(row*w)+w, 2] = src[0:h, 0:w]


while True:

    check, frame = video.read()  # 카메라에서 이미지 얻기. 비디오의 한 프레임씩 읽기, 제대로 프레임을 읽으면 ret값이 True 실패하면 False, frame에는 읽은 프레임이 나옴

    hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    gau_frame = cv2.GaussianBlur(frame, (5, 5), 0)  # 노이즈 제거 - 얻어온 프레임에 대해 5x5 가우시안 필터 먼저 적용

    low = cv2.getTrackbarPos('threshold 1', 'Canny Edge')  # 사용자 설정 신뢰도 임계값 1
    high = cv2.getTrackbarPos('threshold 2', 'Canny Edge')  # 사용자 설정 신뢰도 임계값 2

    height = gau_frame.shape[0]  # 이미지 높이
    width = gau_frame.shape[1]  # 이미지 넓이
    depth = gau_frame.shape[2]  # 이미지 색상 크기
    
    frame_canny = cv2.Canny(gau_frame, low, high)  # 트랙바로부터 읽어온 threshold 1,2 값들을 사용하여 Canny 함수 실행

    # 화면에 표시할 이미지 만들기 (1 x 2)
    result = create_image_multiple(height, width, depth, 1, 2)  # 화면 표시할 1x2 검정 이미지 생성
    showMultiImage(result, gau_frame, height, width, depth, 0, 0)  # 왼쪽 (0, 0)
    showMultiImage(result, frame_canny, height, width, 1, 0, 1)  # 오른쪽 (0, 1)

    cv2.imshow('Canny Edge', result)
    if cv2.waitKey(1) == 32:
        break

video.release()
cv2.destroyAllWindows()

 

점수 10/10

 

 

  ❤와 댓글은 큰 힘이 됩니다. 감사합니다 :-)  

반응형