● 목적:
- 이 과제에서는 웹캠의 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. 아래의 영상에 대하여 다음 질문에 답하세요.
![](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
A. 위 영상의 화소 100 위치에서 Prewitt 마스크로 convolution 하여 그라디언트 벡터를 계산하시오. 아래의 Prewitt 마스크 참조 바랍니다.
![](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
B. 100 위치의 에지 강도를 구하세요.
C. 그라디언트의 방향은 몇도 인지 계산하고 위 그림으로부터 추측할 수 있는 에지의 방향과 어떠한 관계인지 설명하세요.
D. 이 문제의 풀이도 PPT에 포함시키세요.
과제내용
![](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
![](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
![](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
![](https://blog.kakaocdn.net/dn/bBBa5P/btqH3Cb3dyz/ySqBZAkDhti5IA2SZQE6PK/img.png)
![](https://blog.kakaocdn.net/dn/rQEWN/btqHZjKXbOd/6A04Y5vocJvBLWKnjLmOK1/img.png)
![](https://blog.kakaocdn.net/dn/bCKKRh/btqH2yuaEMn/jaBM63lGckkwriN44fSP0k/img.png)
![](https://blog.kakaocdn.net/dn/byQBTd/btqH0pD8uJG/TTtGTHkJIDdBUmkWFmkUqk/img.png)
![](https://blog.kakaocdn.net/dn/sqDUw/btqH3CQGk7m/kKyQBlkvm7gMrqAbuwPEaK/img.png)
![](https://blog.kakaocdn.net/dn/btdPRI/btqH3DvhMrY/4Vc6krknb2gpbDI7mkciZK/img.png)
![](https://blog.kakaocdn.net/dn/qXjip/btqHU7SfTBb/UjLpu0iG59B5ektMQTvhXK/img.png)
![](https://blog.kakaocdn.net/dn/pq304/btqHT1EdECG/EKmb0AHz7JfZOmyOs40W71/img.png)
![](https://blog.kakaocdn.net/dn/0wsXx/btqHYJXuvhV/rHwMDcQkvobvpoS9zEH3gK/img.png)
![](https://blog.kakaocdn.net/dn/pgfj0/btqHR7kuh8s/blstfaYWVlEv6ew8k2RtVk/img.png)
![](https://blog.kakaocdn.net/dn/xqAG2/btqHT0SWkbE/rvKaVAV6mm60A50M8iWs7K/img.png)
![](https://blog.kakaocdn.net/dn/cfVVSt/btqHZHkXCvJ/xuvS1ZaVofA1xVHlmKrGC1/img.png)
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
❤와 댓글은 큰 힘이 됩니다. 감사합니다 :-)
'archive. > 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 |