일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 자바 실습
- CSS
- 데이터분석
- 자바스크립트
- 정보처리기사필기
- 순환신경망
- JDBC
- 자바스크립트심화
- html/css
- 오블완
- 중학수학
- 정보처리기사실기
- 상속
- 딥러닝
- rnn
- 파이썬
- JSP
- 데이터베이스
- c언어
- 혼공머신
- 중학1-1
- SQL
- JSP/Servlet
- 자바
- 연습문제
- 개발일기
- 머신러닝
- 컴퓨터비전
- 컴퓨터구조
- 디버깅
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
OpenCV로 시작하는 컴퓨터 비전 11 - 연습문제 풀기 3 : 문제 7~9번 본문
이제 마지막 연습문제이므로 좀 더 힘을 내며 마무리를 잘해볼 것이다. 새벽 시간에 수업 영상을 들으려고 했는데 이건 좀 어려울 것 같다.
연습문제 풀기 세번째
문제 7번
프로그램 2-7에서 왼쪽 버튼을 클릭하면 직사각형, 오른쪽 버튼을 클릭하면 원이 그려지도록 확장하시오.
하지만 마우스 오른쪽을 클릭했을 때는 파란색 원이 만들어지지 않았다. 그 이유가 뭘까? 오른쪽 클릭으로 원을 그릴 때 (x+100, y+100)을 중심으로 설정하는 부분이 문제임을 알게 되었다. cv.circle() 함수에서 중심 좌표 (x, y)는 고정해야 하며, 반지름만 설정해야 원이 원하는 위치에 올바르게 그려진다. 현재 코드는 반지름 대신 좌표 (x+100, y+100)이 들어가면서 올바른 원이 그려지지 않는 상태인 것이다.
코드 다시 수정하기
이제 마우스 오른쪽으로도 파란색 원이 잘 그려지다.
문제 8번
프로그램 2-8에서 왼쪽 버튼은 이전처럼 직사각형을 그리고 오른쪽 버튼은 원을 그리도록 확장하시오. 오른쪽 버튼을 클릭한 곳이 원의 중심이고 오른쪽 버튼을 놓은 곳이 원주다.
역시 원으로 그린 건 표시가 되지 않았다. 원을 설정하는 부분의 코드가 잘못된 것 같다. 현재 코드에서 elif event == cv.EVENT_RBUTTONDOWN이 두 번 사용되고 있으며, 두 번째 조건에서 마우스 버튼을 놓는 이벤트(cv.EVENT_RBUTTONUP)를 확인하지 않고 있다. 이를 수정하여 마우스 오른쪽 버튼을 눌렀을 때 초기 위치를 저장하고, 오른쪽 버튼을 놓았을 때 원을 그리는 코드로 바꿔보면 될 것 같다.
코드 다시 수정하기
이제 원과 직사각형이 잘 그려진다. 두 원 사이의 거리를 측정하는 부분도 없었고 imshow를 함수 안쪽에 써서 실행이 되지 않았던 거였다. 하지만 두 점 사이의 거리를 구하는 코드가 이해가 되지 않아서 chatgpt에게 물어보았다.
두 점 사이의 거리를 구하는 코드 분석하기
이 코드는 두 점 (ix, iy)와 (x, y) 사이의 거리를 계산하여, 이 값을 정수형으로 변환한 후 radius 변수에 저장하는 역할을 한다. 여기서 계산된 radius는 원을 그릴 때 사용된다.
코드 설명
1. 두 점 사이의 거리 공식
- 두 점 (x1, y1)와 (x2, y2) 사이의 거리는 다음 수식으로 계산할 수 있다.
- 이 공식을 코드로 표현하면 ((x - ix) ** 2 + (y - iy) ** 2) ** 0.5와 같다.
2. 각 부분 설명
- (x - ix) ** 2
- x 좌표의 차이를 제곱
- (x - ix)는 x와 ix 사이의 가로 거리
- (y - iy) ** 2
- y 좌표의 차이를 제곱
- (y - iy)는 y와 iy 사이의 세로 거리
- (x - ix) ** 2 + (y - iy) ** 2
- 피타고라스의 정리에 따라 두 제곱의 합을 구한다. 이 값은 두 점 사이의 거리를 제곱한 값이다.
- ((x - ix) ** 2 + (y - iy) ** 2) ** 0.5
- 전체 표현을 ** 0.5로 제곱근을 취하여 두 점 사이의 실제 거리를 구한다.
3. 정수 변환
- int(...)는 계산된 거리 값을 정수형으로 변환한다. 이는 원의 반지름으로 사용할 수 있는 값이 된다.
수학을 잘 모르니 거리를 구하는 공식도 알지 못했다. 나중에 도형 단원에 들어갈 때 공부하게 될 것 같다.
문제 9번
프로그램 2-9에서 +를 누르면 붓의 크기가 1만큼 커지고 -를 누르면 붓의 크기가 1만큼 작아지게 확장하시오.
◆ 힌트 : 29~32행의 while 루프 속에 elif cv.waitKey(1)==ord('+'): 행을 추가하는 방식으로 코딩하기
처음에는 그림이 안 그려졌는데 그 이유는 imshow를 while 문 바깥에 넣었기 때문이다. 코드를 수정한 후에 잘 그려진다.
이렇게 붓의 굵기를 조절하며 그릴 수 있었다.
학습을 마치고
오늘 새벽 2시부터 7시까지 5시간 동안 컴퓨터 비전을 공부해 보았다. 어제는 잘 안되었던 문제도 해결했고 2장 연습문제까지 모두 풀고 공부를 마칠 수 있어서 정말 기쁘다.
스파이더가 좀 말썽을 부려서 중간에 몇 번이나 껐다가 다시 켜고 컴퓨터도 재부팅을 시키면서 했다. 이젠 좀 잘 되었으면 좋겠다. 아침 루틴을 수행하고 이제 운동을 갈 것이다.
'인공지능 > 컴퓨터 비전' 카테고리의 다른 글
컴퓨터 비전 2 - Gray와 Color 이미지 만들기 및 이진 이미지 처리하기 (0) | 2024.11.08 |
---|---|
컴퓨터 비전 1 - 이미지 읽고 출력하는 실습해보기 (0) | 2024.11.08 |
OpenCV로 시작하는 컴퓨터 비전 10 - 연습문제 풀기 2 : 문제 4~6번 (0) | 2024.11.08 |
OpenCV로 시작하는 컴퓨터 비전 9 - 연습문제 풀기 1 : 문제 1~3번 (0) | 2024.11.08 |
OpenCV로 시작하는 컴퓨터 비전 8 - 페인팅 기능 만들기 (0) | 2024.11.08 |