2023. 1. 27. 09:00ㆍVB.NET/OpenCVSharp
이미지 위에 도형 그리는건 글씨 쓰는것 만큼이나 정말 빈번하게 사용되는 기능이다. CCTV를 분석하든, 얼굴 인식을 하든, 어떤 기능을 만들든 최종 사용자에게 그 기능의 결과를 보여주기 위해서는 도형을 적절하게 사용해야 한다.
그게 직선, 원, 타원, 삼각형, 사각형, 다각형 등 어떤 형태로 보여주는가의 차이만 있을뿐 결국은 이미지 위에 도형을 그려야 하는 상황은 늘 발생하니 이번 강좌도 유심히 살펴보도록 하자.
메인폼에 버튼 추가 - Name : ButtonPoly, Text : Poly
버튼클릭 이벤트에 아래 소스를 추가해서 확인해보자.
Private Sub ButtonPoly_Click(sender As Object, e As EventArgs) Handles ButtonPoly.Click
Dim org As New Mat("D:\test\chipmunk.jpg", ImreadModes.Color), dst As New Mat
org.CopyTo(dst)
dst.Rectangle(New Rect(100, 100, 200, 200), New Scalar(0, 255, 0), 1)
dst.Rectangle(New Rect(400, 100, 200, 200), New Scalar(0, 255, 0), -1)
dst.Circle(New Point(200, 500), 100, New Scalar(255, 0, 0), 1)
dst.Circle(New Point(500, 500), 100, New Scalar(255, 0, 0), -1)
dst.Ellipse(New RotatedRect(New Point2f(200, 800), New Size2f(200, 300), 30), New Scalar(0, 0, 255), 1)
dst.Ellipse(New RotatedRect(New Point2f(500, 800), New Size2f(200, 300), 60), New Scalar(0, 0, 255), -1)
PictureBoxOrg.Image = org.ToBitmap : PictureBoxDst.Image = dst.ToBitmap
End Sub
프로젝트 실행후 Poly 버튼을 누르면 아래 화면과 같이 결과가 나와야 성공
이미지 위에 도형을 그리는건 많이 사용되는만큼 그때그때 원하는 결과를 볼 수 있으니 이래저래 여러가지 방법으로 테스트하면서, 숫자도 바꿔가면서 익숙해질때까지 제대로 해보도록 하자.
Line 1 : Dim org As New Mat("D:\test\chipmunk.jpg", ImreadModes.Color), dst As New Mat
Line 2 : org.CopyTo(dst)
원본에 이미지를 넣고 동일한 이미지를 대상에 복사하자. 다음줄부터는 대상 이미지 위에 차근차근 하나씩 도형을 그려보도록 하겠다.
Line 3 : dst.Rectangle(New Rect(100, 100, 200, 200), New Scalar(0, 255, 0), 1)
이미지 위에 사각형을 그리는 함수로 정말 정직한 함수명이다. 원하는 위치에 원하는 크기와 색깔로 사각형을 그려준다. 세번째 파라미터인 thickness는 선 굵기를 나타내니 숫자를 조금씩 키워보면서 진짜 두꺼워지는지 확인해보자. 그뒤에 LineTypes과 shift 파라미터도 있지만 그닥 쓸일이 없어서 이번 예제에서는 패스하도록 하자.
이렇게 그린 이미지가 저위 화면의 첫번째 속이 비어있는 초록색 사각형이다. 누차 얘기했지만 OpenCVSharp에서의 색깔값 순서는 BGR이라는 것만 잊지 말자. 이 소스의 (0, 255, 0)으로 인해 B=0, G=255, R=0이 되니 초록색 사각형이 그려지는 것이다.
Line 4 : dst.Rectangle(New Rect(400, 100, 200, 200), New Scalar(0, 255, 0), -1)
위 Line3과 동일한데 마지막 파라미터인 thickness가 -1이다. 이 경우 사각형의 내부를 채워준다. 위 Line 3에서 설명했듯 thickness는 선 굵기를 나타내니 음수가 나올 수는 없다. 이걸 이용한 나름의 편법으로 -1을 넣어주면 사각형 안을 채워주도록 만든것 같다.
Line 5 : dst.Circle(New Point(200, 500), 100, New Scalar(255, 0, 0), 1)
Line 6 : dst.Circle(New Point(500, 500), 100, New Scalar(255, 0, 0), -1)
이미지 위에 원을 그리는 함수로 이또한 정직한 이름이다. 원의 중심과 지름, 색깔을 파라미터로 입력하면 원을 그려준다. OpenCVSharp을 쓸때마다 느끼지만 정말 많이 고민해서 만들어놓은 라이브러리라는걸 알 수 있다. 마지막 파라미터는 위 사각형과 동일하니 참고하자.
Line 7 : dst.Ellipse(New RotatedRect(New Point2f(200, 800), New Size2f(200, 300), 30), New Scalar(0, 0, 255), 1)
Line 8 : dst.Ellipse(New RotatedRect(New Point2f(500, 800), New Size2f(200, 300), 60), New Scalar(0, 0, 255), -1)
이번에는 타원이다. 타원은 중심과 크기, 기울임 각도로 이루어진다. 여전히 마지막 파라미터는 동일하다.
Line 9 : PictureBoxOrg.Image = org.ToBitmap : PictureBoxDst.Image = dst.ToBitmap
역시 그렇듯 최종 결과를 화면에 뿌려주는 기능이다.
이외에도 Line, PolyLines, Fillpoly등 도형 관련해서 다양한 함수를 제공하니 검색을 통해 원하는 도형을 이미지 위에 그려보자.
'VB.NET > OpenCVSharp' 카테고리의 다른 글
[VB.NET] 차근차근 OpenCVSharp 강좌 - 17. 이미지 윤곽선 (0) | 2023.01.29 |
---|---|
[VB.NET] 차근차근 OpenCVSharp 강좌 - 16. 이미지 비트연산 (0) | 2023.01.28 |
[VB.NET] 차근차근 OpenCVSharp 강좌 - 14. 이미지 위에 글씨 쓰기 (0) | 2023.01.26 |
[VB.NET] 차근차근 OpenCVSharp 강좌 - 13. 모자이크 처리 (0) | 2023.01.25 |
[VB.NET] 차근차근 OpenCVSharp 강좌 - 12. 픽셀 절대값 / 절대값의 차이 (0) | 2023.01.24 |