2024.10.12
Open CV에서는 line() 함수를 사용하여 영상위에 직선을 그릴 수 있는데 다양한 그리기 함수를 통해 vscode를 통해
그려 보겠습니다!
우선 line()의 경우
img를 통해 내가 그리고자 하는 그림의 베이스를 잡아준 뒤에 그 이미지의 해당 시작점과 끝점을 지정해주고
색상, 두께, 타입을 지정해주면 시작점을 기점으로 끝점까지 해당 타입에 맞게끔 그려주도록 나와있습니다.
타입의 경우 크게 4가지로 되어있어요
바로 실습을 진행해보겠습니다.
(python code)
이미지의 크기를 넘파이로 먼저 지정해주고, 이후 시작점, 끝점 지정, 이후 색상지정을 해주게되면 다음과 같은 결과가 나오는데 이때
굵기가 다른이유는 1, 3, 10 으로 thickness를 지정해줬기 떄문입니다!
(output)
다음으로는 화살표 형태의 직선을 그려야 하는 경우 arrowedLine() 함수를 사용해 보겠습니다!
앞과 마찬가지로 이미지, 시작점, 끝점 ,색상, 두께, 타입은 다를게 없는듯 하네요! 다만 화살표 길이에 대한 비율을 직접 설정할 수 있습니다.
다음은 마커를 통해 여러 도형을 그려보려고 하는데요 drawMarker()함수를 사용하면 뚝딱 만들어 낼 수 있어요!
마커함수는 시작점과 끝점은 존재하지 않고 그리고자 하는 그 마커의 출력위치, 색상, 종류, 크기, 두께, 타입 순으로 파라미터를
입력을 해주면 될 듯 합니다!
두 그리기 함수의 대한 실습을 진행해보면
(python code)
(output)
다음과 같은 결과를 얻을 수 있습니다
색상의 경우 G B R 순이기 때문에 색이 빨간색이 나온것이고, 나름 너비의 좌표차이 만큼 화살표 길이도 다른것 같네요!
drawMarker()의 경우 크로스 모양부터 역삼각형까지 잘 그려진 것으로 나타납니다.
다음은 도형함수를 직접 사용하여 사각형, 원, 타원, 다각형을 그려보겠습니다
맞다 대부분 import cv2를 해서 사용합니다!
사각형의 경우 rectangle() 함수를 사용하면 되는데 간단히 설명해보자면
출력하고자하는 이미지 영상을 지정하고, 사각형을 그리고자 하는 꼭짓점과 그에 해당하는 대각점을 지정해 줘야합니다.
이후 색상을 지정하고, 두께, 선타입을 지정하면 뭐 어렵지않게 알 수 있는데요 ! 실습을 진행해 보겠습니다.
(python code)
코드를 확인해보면 시작점과, 그리려고하는 사각형의 대각부분 좌표를 넣고 색상을 넣으면 다음과 같은 결과가 나옵니다!
이때 두번째줄에 있는 사각형의 경우 thickness를 제가 임의로 -1로 지정하게된다면 내부를 색칠해 주네요!
다음은 원을 그려보겠습니다. circle() 함수를 사용하면 되는데
영상 변수를 넣어주시고, 원의 중심, 반지름을 지정해주면 됩니다! 바로 실습 해볼게요
(python code)
2개의 원을 그릴건데 우선 중심을 동일하게 지정해놓고 반지름이 30인, 60인 원을 그려보겠습니다!
또한 내부에 그려지는 원의 경우 thickness -1로 지정하여 채워볼게요!
(output)
아직까지는 할만하다는걸 느낄 수 있습니다….
다음은 타원입니다! 타원의 경우 ellipse() 함수를 통해 그릴 수 있습니다.
타원은 조금 복잡한데요 우선 영상 변수 지정, 중심 지정을 해준다음 타원의 반지름을 x축, y축 각각 지정을 해줘야합니다!(장축 단축느낌)
이후 타원의 회전각도, 타원 호의 시작각도, 타원 호의 끝 각도를 지정해주면 되는데 말이 너무 어려워서 실습을 통해 설명 이어가겠습니다.
(python code)
(output)
우선 결과값을 확인해 본다면 저기 20에 해당하는 부분이 타원의 회전 각도라고하는데 원래 똑바로 있어야하는 타원을 기울여주는? 느낌인듯 하네요 또한 픽셀의 경우 저희가 생각하는 데카르트 좌표계로부터 반시계방향으로 기울어지는게 아닌 시계방향으로 기울어지기때문에 그렇게 생각해주면 좋을 듯 합니다.
이후 0도부터 270, 360도로 그려주면 저런 결과가 나오는 듯 합니다!
다음은 다각형을 그려볼건데요! 다각형의 경우 polylines() 함수를 통해 그리면 됩니다!
특이하게도 여기선 다각형이기 떄문에 여러 좌표를 pts로 넣어줘야 할 것 같아요! 조금 어려우니 실습으로 들어가 보면
(python code)
(output)
우선 포인트로 이을 점을 6개를 찍어주면 처음과 끝이 되겠죠? 또한 isClosed를 통해서 다각형이 잘 닫혀있는지를 나타내야합니다
True 설정을 했다면 제일 처음 점과 마지막으로 지정한 포인트를 이어서 닫게끔 해주는 느낌이에요! 조금 쉽지 않았습니다. (제기준)
마지막으로 문자열 출력을 진행해 보겠습니다… (개인적으로 제일 이해하기 어려웠음)
문자열의 경우 OpenCV에서는 putText() 함수를 사용하게 되는데 이때 출력할 문자열, 폰트 정보를 설정하면 됩니다
참고로 영문자와 숫자는 가능하지만 한글은 출력 안되네요,, (열심히 하겠습니다)
파라미터 부터 간단하게 봐본다면 (C++ 기반의 함수이지만 파이썬에서도 동일한 파라미터로 작용합니다!)
우선 입출력할 영상을 지정해주고, 출력하고자하는 문자열을 지정합니다! 이후 문자열을 출력할 위치의 좌측 하단좌표를 org로
지정해야합니다.. (실습으로 봐보죠) 그리고 폰트, 크기, 색상, 두께 등등 기본적인 것들을 채워 넣어 주면 됩니다! 이때 폰트의경우
HERSHEY폰트를 많이 쓰나봐요!
주로 심플랙스를 쓸거 같네용 간단한 실습을 진행해보면
(python code)
(output)
이런식의 결과를 나타낼 수 있습니다!! (아직 끝난거아님)
기본적으로 출력하는 방법을 배웠다면,, 이제 활용을 해봐야겠죠? OpenCV에서는 문자열 출력을 위해 필요한
사각형의 크기를 가늠할 수 있는 getTextSize() 함수를 제공합니다
제가 위에 적었던 텍스트가있다면 그 텍스트 출력을 위해 필요한 사각형 영역 크기를 가늠하게 해준다고 하는데요 이게 좀 어렵더라구요
(python code)
코드를 본다면 우선 출력할 이미지의 베이스 크기를 지정해주고, 텍스트, 폰트, 크기, 굵기까지 기본으로 그려줍니다
그다음 getTextSize를 통해 그리려는 텍스트의 너비와 높이 크기를 먼저 얻어옵니다!
이때 org인 시작점을 지정을 해줘야하는데.. 이게 빡셌습니다 간단히 손필기로 이해를 해보자면
x 포인트의 경우 너비는 이미지 크기에서 텍스트 크기를 빼준것의 절반인것을 쉽게 이해할 수있는데
y 포인트의 경우에는 같은 값이지만 접근하는 방법이 두가지인 것으로 제가 이해했습니다.
- 이미지 높이와 텍스트 높이를 더해서 나눈 2의 몫인 경우
- 이미지 높이에서 텍스트 높이를 뺀 값에 나눈 2의 몫 + 텍스트 높이를 더한 값 은 결국 같아서 제가 혼동이 왔었습니다!
책의 경우에는 1번만 설명이 되어있어서 저는 2번을 생각했거든요,,ㅎㅎ
또한 sizeText는 너비(열), 높이(행) 순으로 결과를 나타내지만 numpy의 경우에는 행(높이), 열(너비) 순으로 값을 나타내니
혼동에 조심하세요! 이후 rectangle함수를 통해서 텍스트의 위치까지 org에서, org의 대각에 해당하는 점까지 그려보면!
(output)
이런 결과가 나옵니다! ,,
뭔가 넘파이 상의 배열은 행렬 이지만 좌표상에서는 (y, x)이고 혼동스러운걸 잘 적응해야겠네요,,ㅎㅎ
sizeText에서는 너비 높이 순이니까 잘 잊지말아봅시다,,!
'컴퓨터 비전' 카테고리의 다른 글
파이썬으로 배우는 openCV (1) (2) | 2024.10.12 |
---|---|
파이썬을 이용한 openCV and Matrix (0) | 2024.10.12 |
컴퓨터 비전 개요 (9) | 2024.10.11 |