관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

OpenCV로 시작하는 컴퓨터 비전 11 - 연습문제 풀기 3 : 문제 7~9번 본문

인공지능/컴퓨터 비전

OpenCV로 시작하는 컴퓨터 비전 11 - 연습문제 풀기 3 : 문제 7~9번

huenuri 2024. 11. 8. 07:02

이제 마지막 연습문제이므로 좀 더 힘을 내며 마무리를 잘해볼 것이다. 새벽 시간에 수업 영상을 들으려고 했는데 이건 좀 어려울 것 같다.


 

 

 

 

연습문제 풀기 세번째

 

문제 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장 연습문제까지 모두 풀고 공부를 마칠 수 있어서 정말 기쁘다.

스파이더가 좀 말썽을 부려서 중간에 몇 번이나 껐다가 다시 켜고 컴퓨터도 재부팅을 시키면서 했다. 이젠 좀 잘 되었으면 좋겠다. 아침 루틴을 수행하고 이제 운동을 갈 것이다.