● 목적:
- 이 과제에서는 웹캠의 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
❤와 댓글은 큰 힘이 됩니다. 감사합니다 :-)
'Schoolwork > 컴퓨터그래픽스 및 비젼' 카테고리의 다른 글
[Python] 07주차 과제 - 번호 인식을 위한 전처리(이진화) (0) | 2020.09.05 |
---|---|
[Python] 06주차 과제 - Perspective transform (0) | 2020.09.05 |
[Python] 04주차 과제 - 웹캠영상에서 얼굴 검출 (0) | 2020.09.05 |
[Python] 03주차 과제 - 히스토그램 역투영과 오츄의 이진화를 이용한 얼굴 검출 (0) | 2020.09.05 |
[Python] 02주차 과제 - 영상에 이름 써넣기 (0) | 2020.09.05 |