C# OpenCV 강좌 : 제 34강 - 경계 사각형

C# OpenCV Bounding Rectangle

C# OpenCV 강좌 : 제 34강 - 경계 사각형
[ C#-OpenCvSharp2 ] - 윤대희

경계 사각형(Bounding Rectangle)


1 영상이나 이미지에서 한 객체를 둘러싸고 있는 최소 직사각형으로, 최소 경계 직사각형이라고도 합니다.

이 객체들의 최소 직사각형을 구할 수 있습니다.


원본(Source, src)를 영상이나 이미지를 사용하면 됩니다.

영상 사용하기 : 3강 바로가기

이미지 사용하기 : 4강 바로가기



Class


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace test
{
    class OpenCV : IDisposable
    {  
        IplImage bound;
        
        public IplImage BoundingRectangle(IplImage src)
        {
            bound = new IplImage(src.Size, BitDepth.U8, 3);

            int num = 100;
            CvRNG rng = new CvRNG(DateTime.Now);
            CvPoint[] points = new CvPoint[num];
            for (int i = 0; i < num; i++)
            {
                points[i] = new CvPoint()
                {
                    X = (int)(rng.RandInt() % (bound.Width)),
                    Y = (int)(rng.RandInt() % (bound.Height))
                };
                bound.Circle(points[i], 3, new CvColor(0, 255, 0), Cv.FILLED);
            }

            CvRect rect = Cv.BoundingRect(points);
            bound.Rectangle(new CvPoint(rect.X, rect.Y), new CvPoint(rect.X + rect.Width, rect.Y + rect.Height), new CvColor(255, 0, 0), 2);
   
            return bound;
        }
                   
        public void Dispose()
        {
            if (bound != null) Cv.ReleaseImage(bound);
        }
    }
}



Class Code


int num = 100;
CvRNG rng = new CvRNG(DateTime.Now);
CvPoint[] points = new CvPoint[num];
for (int i = 0; i < num; i++)
{
    points[i] = new CvPoint()
    {
        X = (int)(rng.RandInt() % (bound.Width)),
        Y = (int)(rng.RandInt() % (bound.Height))
    };
    bound.Circle(points[i], 3, new CvColor(0, 255, 0), Cv.FILLED);
}

num은 공간 안에 사용될 점의 개수입니다.

CvRNG를 이용하여 난수를 발생시킵니다. DateTime.Now를 이용해 시간 데이터를 현재 시간으로 초기화합니다.

CvPoint[]를 이용해 점이 저장될 배열을 선언합니다.

for문을 이용해 100개의 점에 임의의 좌표로 점들의 위치를 지정합니다.

이미지의 너비와 높이나머지 연산을 하여 너비와 높이의 크기를 넘어가지 않게 합니다.

이 후, 해당 지점의 원을 그려 시각화합니다.

난수를 통해 얻어진 임의의 점 대신에 이미지에서 검출된 점들을 사용하여도 됩니다. 이 구문 대신에 코너, 중심점, 등을 대체하여 사용 가능합니다.


CvRect rect = Cv.BoundingRect(points);
bound.Rectangle(new CvPoint(rect.X, rect.Y), new CvPoint(rect.X + rect.Width, rect.Y + rect.Height), new CvColor(255, 0, 0), 2);

Cv.BoundingRect(점이 저장된 배열)를 이용하여 경계 사각형을 구합니다.

이 후, Rectangle를 이용하여 Cv.BoundingRect를 이용해 구해진 사각형의 좌표너비와 높이를 이용하여 시각화합니다.



Result


num = 2

2


num = 3

3


num = 4

4


num = 8

5


num = 100

6



Book Image

개정판이 출간됐습니다!

C#과 파이썬을 활용한 OpenCV 4 프로그래밍 (개정판)

컴퓨터 비전 기초 이론부터 머신러닝을 활용한 영상 처리 프로젝트까지

  • C#과 파이썬용 OpenCV의 데이터 형식과 행렬 및 배열 연산
  • 이미지/동영상/카메라를 활용한 입출력과 결과 저장
  • 전처리 과정과 정보를 탐색하기 위한 이미지 변형
  • 유의미한 정보를 검출하기 위한 이미지 변환
  • 이미지에서 정보를 검출 및 인식
  • 객체 검출을 포함한 모션 추적
  • K-means, KNN, SVM 등의 머신러닝 알고리즘 적용 방법
  • 카페(Caffe), 다크넷(Darknet), 텐서플로 모델을 활용한 딥러닝 모듈 적용 방법
  • Tesseract-OCR과 C# OpenCvSharp4를 활용한 프로젝트
  • 텐서플로와 Python OpenCV4를 활용한 프로젝트
  • 윤대희 저 | 위키북스

    [yes24 바로가기] [알라딘 바로가기] [교보문고 바로가기]

    후원하기


    ⤧  Previous post C# OpenCV 강좌 : 제 33강 - Blob 윤곽선 검출 ⤧  Next post C# OpenCV 강좌 : 제 35강 - 변환
    C#-OpenCvSharp2 Category