본문 바로가기

개인공부/python

나 혼자 하는 프로젝트 5탄 - OpenCV - 2. 도형 그리기

도형 그리기가 필요한 이유는, 이미지를 처리하는 과정에 특정 부분만 캡쳐하거나 수정하기 위해서이다.

 

특정 이미지 파일을 불러와서 사용해도 무방하지만, 정확한 개념을 이해하기 위해 빈 스케치북을 만들어서 도형을 그리는 방법을 공부해보자.

코드 작성의 편의를 위하여 numpy 라이브러리를 추가로 사용하였다.

np.zeros()함수를 이용하면 지정된 영역에 모두 0 값으로 채워줄 수 있다.RGB에서 0,0,0 은 검은색을 의미한다.

먼저 사각형이다.

빈 스케치북 img에 [] 좌표값을 넣어주면 되는데, y,x 순서이다.

위 코드에서는 y 100부터 200까지, x 200부터 300까지의 값을 255,255,255(흰색)으로 변경해 주었다.

직선은 3가지 옵션값이 존재한다. 먼저 기본값 cv2.LINE_8을 이용하여 직선을 그려 보았다.

COLOR와 THICKNESS는 직접 입력해도 무관하다.

한가지 특이한 점은 cv2.line() 에 전달되는 좌표값은 (x,y) 라는 점이다.

옵션값이 다른 3가지 직선을 그어보았다.

cv2.LINE_8과 cv2.LINE_4는 눈으로 보기에는 큰 차이는 없어 보인다.

cv2.LINE_AA는 확실히 부드러운 대각선이 그어졌다.

위 이미지에서 왼쪽이 LINE_4 이고 오른쪽이 LINE_8이다.

LINE_4의 경우 상하좌우로만 연결이 가능하기에, 대각선을 그릴때 저렇게 계단식으로 나오게 되며

LINE_*의 경우에는 대각선을 포함한 8방향으로 연결이 가능하기에, 마치 점.점.점을 찍듯이 대각선을 그릴 수 있다.

 

원을 그릴 경우에는 cv2.circle() 을 이용한다.

원은 사각형과 다르게 중심점과 반지름을 이용하여 크기를 조절할 수 있다. 나머지 부분은 직선 그리기와 동일하다.

선두께 옵션값을 cv2.FILLED로 설정하면, 중심까지 색으로 채워진 원을 그릴 수 있다.

선두께 옵션값을 -1로 해도 동일하게 속이 꽉 찬 원을 그릴 수 있다.

사각형은 cv2.rectangle()에 왼쪽 위 좌표와 오른쪽 아래 좌표를 지정하여 그려줄 수 있다.

 

다각형을 그리기 위해서는 np 라이브러리를 이용하면 편리하다.

먼저 np.array()를 통해 3개의 리스트를 포함하는 하나의 리스트를 갖는 배열을 만들어 주었다.

numpy 라이브러리의 경우 설명이 많이 복잡하기 때문에, 따로 구글링을 통해 학습하는걸 추천한다.

닫힘 여부란, 첫 시작점과 끝 점을 이어주는지 여부를 말한다.

총 3개의 좌표를 전달하였지만, 오른쪽 개체의 경우 닫힘 여부를 False로 설정하였기에, 삼각형이 나오지 않고 저런 형태로 출력 되었다.

꽉찬 다각형을 그리기 위해서는 cv2.fillPoly() 를 사용한다.

이번엔 pts3 변수에 np.array()를 이용하여 두개의 좌표값을 리스트 형태로 선언하였다.

따라서 cv2.fillPoly()에 pts3 그대로 전달하여도 해당 변수를 리스트 자료형으로 인식하여 작동한다.([] 갯수에 유의하자)