11강 - OpenCV와 함께하는 이미지 기초 - 이미지에 그리기 - 2부 - 텍스트 및 다각형
파트 2로 돌아왔습니다 이번엔 이미지 위에 그리기를 시작하겠습니다
이미지에 텍스트를 입력하는 법과 사용자 지정 도형을
만드는 법을 보겠습니다
그럼 노트북으로 이동해서 지난번 강의부터 이어가보죠
지난번 강의에서 공부했던 노트북을 다시 보겠습니다
텍스트를 어떻게 추가하는지 보여드릴게요
먼저 폰트를 결정해야 하는데 사실 선택권은 없어요
cv2 내장 폰트만 선택 가능한데 솔직히 예쁜 폰트는 아닙니다
{font = cv2.FONT}를 입력하고 탭 키를 누르면
여러 항목이 뜹니다
사실 대부분 다 비슷해 보이는데요
가장 간단한 건 'cv2.FONT_HERSHEY_SIMPLEX' 입니다
그러면 선택을 합니다
그다음에 {cv2}를 적습니다
그리고 사각형, 원, 선 명령어처럼 텍스트 명령어를 입력합니다
실제 텍스트를 써 볼 이미지를 매개변수로
불러옵니다
이 경우에는 문자열로 넘기고 'Hello'를 쓰겠습니다
그다음에 'org'를 입력하는데 자료집을 보면 이건
이미지 문자열의 왼쪽 아래 모서리를 나타냅니다
텍스트는 상자 안에, 왼쪽 아래 모서리 어딘가에
있게 되는 거죠
그러면 텍스트 방향을 왼쪽 아래로 보내겠습니다
X 값은 10으로 하고 Y 값은 500으로 할게요
그래서 10 그리고 500을 적습니다
그다음에 아까 선택한 폰트 페이스를 입력합니다
폰트 페이스는 앞서 선택한 폰트 종류고 이제 크기를 정합니다
폰트 크기를 얼마로 할 건지요
폰트 크기는 4로 할 건데 이미지 크기에 맞게 찾아보세요
그다음은 색상이네요
흰색으로 할 경우 색상 채널에 다 255를 입력합니다
다른 매개변수로는 굵기를 지정할 수 있습니다
선의 굵기를 어느 정도로 할지요
그럼 선 굵기는 3으로 할게요
마지막은 선의 종류를 정하는 건데요
{cv2.LINE}을 입력하고 탭 키를 누르면
몇 가지 옵션이 보입니다
보통 '선_AA'를 선택하는데 솔직하게 말씀드리자면
4와 8은 잘 못 봤어요 굵기 4와 8 이상을 선택하면
보통 오버라이드 되거든요
그러니 {.LINE_AA}를 선택하겠습니다
마지막으로 {plt.show(blank_img)}를 입력합니다
그럼 한번 실행해 보죠
여기 'Hello'가 나타났지요 텍스트 왼쪽 아래 위치에요
X 값은 10, Y 값은 500 위치에 있을 것입니다
텍스트는 이렇게 하시면 되고요 나머지 하나는요
사용자 지정 도형을 만드는 법을 알려 드리겠습니다
가끔 특정한 형태 주변을 둘러싸는데 사용자 지정 도형이 필요합니다
교통 표지판 같은 걸 둘러싸기도 하고 삼각형을 만들 수도 있죠
직사각형이나 원 안에 들어 있는 뭔가를 만들기도 하고요
새 빈 이미지를 만들어 보겠습니다
{blank_img = np.zeros}를 입력합니다
다음은 {(shape =(512,512,3),dtype=np.int32}
이제 새로운 빈 이미지가 생겼습니다
도형을 그리는 첫 번째 단계는 꼭짓점을 정하는 겁니다
{vertices = np.array([])}를 입력합니다
여기에 있는 괄호는 여러 쌍의 목록입니다
여러 쌍을 만들 건데요 우리는 4개를 만들어 봅시다
각 쌍은 X와 Y 좌표가 포함되어 있습니다
첫 번째 꼭짓점은 X는 100 Y는 300으로 정합니다
몇 개 더 만들어 볼게요 여기에 입력하면 됩니다
유의하실 점은 꼭짓점이 서로 겹치거나 이상한 데 가면 안 돼요
오류가 나거나 이상한 도형이 만들어집니다
다음 쌍이 [200, 200]이니까 그다음은 [400, 300]
다음은 [200, 400]을 입력할게요
그게 첫 번째 인자가 되는 거고 정수로 전달되는지 확인해야 합니다
부동으로 변환되지 않게 하고 다음 인자 {dtype=np.int32}를 입력합니다
지금 하고 있는 게 뭐죠?
우리는 배열을 전달했고 여기 괄호 세트를 포함합니다
그리고 여기에 X와 Y 좌표가 있습니다
[100, 100], [200, 200] [400, 300], [200, 400] 그리고 기타 등등요
이게 다 꼭짓점입니다
실행을 시키면 정수형이 나오는데요 여기서 좀 이상해집니다
마지막 단계입니다
실제 꼭짓점이 보이고 인쇄가 되면 제대로 된
포맷인 겁니다
오픈 CV는 사실 특정한 크기를 요구하므로 까다롭습니다
3D 정보가 필요합니다
이 차원을 확인하면 (4,2)로 나오는데 변형이 필요합니다
다른 크기 정보가 필요한 거죠
일단 이 배열이 만들어지면 기본적으로 3 차원 정보를 입력합니다
색상 채널을 위해서인데요 {vertices.reshape}를 입력하고
거의 항상 같은 차원으로 하실 건데요 {(-1, 1, 2)} 입니다
그리고 앞에다 {pts = }를 입력합니다 이게 정확히 무슨 역할을 하는지
비교를 해 보겠습니다
꼭짓점 모양과 점 모양을 비교해서 다른 점은
3차원 정보인 '1'이 추가됐다는 것입니다
다른 괄호에도 동일한 정보를 추가하면 됩니다
여기를 보시면 꼭짓점이 생긴 걸 알 수 있죠
괄호 두 개가 있는 것도요
cv2는 정해진 차원을 사용해야 합니다
점을 보시면 비슷하게 보이는데 다른 점이 있죠
3차원 괄호가 생겼죠 색상 채널이 인식되는 거죠
점 2개에서 3개로 변경함으로써 가능해진 거죠
그래서 색상 채널마다 점이 생겼습니다
모양 변경 시 항상 (-1, 1, 2)를 쓰면 되는데요
너무 걱정하지 마시고
보통은 그냥 하시면 됩니다
cv2 폴리라인을 호출하면 오픈 CV에서 싫어하니까요
{cv2.polylines(blank_img)} 다시 좀 이상해지는데요
두 번째 파라미터로 점 배열을 전달합니다
두 단계 과정이라고 볼 수도 있죠
꼭짓점 모양을 변경하고 그걸 목록으로 전달해야 합니다
cv2.polylines 포맷이 좀 이상한데 원래 그렇습니다
만약 닫고 싶으면 {.isClosed=True)}를 입력합니다
매개변수 정보가 더 필요하면 [shift+tab]을 누를 수 있는데 '닫기'는
그려진 선이 닫혔는지를 알려주는 플래그 역할을 합니다
이걸 닫을 거고, 그다음에 색상을 선택합니다
빨간색으로 한다면 적색 채널은 100 나머지 둘은
0으로 합니다
다음에 굵기는 5로 하고 이미지를 띄워 보죠
{plt.imshow(blani_img)}를 실행하여 이미지를 확인합니다
그러면 우리가 방금 만든 도형이 나타납니다
그러면 이 꼭짓점들이 제대로 표현됐는지 봅시다
여기 있네요
(100, 300) 위치네요 이 점인 것 같습니다
(100, 300)이네요
그다음 (200, 200)을 확인할게요
여기 200에서 위로 가면 200이 여기네요
잘 표현된 거 같네요
그 점이 있어요
텍스트를 입력하고 사용자 지정 도형을 만드는 기본에 대해 배웠습니다
이 코스에서 자주 사용자 지정 도형을 만들지는 않을 건데요
객체 주변에 직사각형을 그리는 건 반드시 할 겁니다
특히 객체 탐지를 배울 때는 말이죠
예를 들어, 이미지 속의 얼굴을 탐지할 때 보통은요
직사각형을 그리죠
이건 꼭 아셔야 해요 기본적으로 이미지를 전달하는 거죠
왼쪽 위 모서리, 오른쪽 아래 모서리 색상과 굵기입니다
cv2 직사각형의 이 개념을 이해하신다면 그리기도
문제없어요
다음 강의에서는 마우스로 그리는 방법을 배워 보겠습니다
지금까지 정적인 걸 다뤘는데 이미지나 비디오도 다뤄보고 싶으실 거예요
'이벤트 선택'이라는 기능을 통해 더 확장해 보겠습니다
오픈cv의 정말 멋진 기능인데 기대되네요
질문이 있으시면 Q&A 포럼에 올려 주세요
질문 없으시다면, 다음 강의 때 뵙겠습니다