chapter 11. 객체 가장자리 사각형 그리기

지난 시간 알아본 Find Contour에서 확인 된 객체를 인식 용이토록 사각형으로 그리도록 하자.

FindContours()함수까지 진행 사항은 동일하고, 이후 DrawContours() 함수 대신에 반복문을 사용해 그린다.

사각형 그리기

//image load 먼저 한 후,

Mat gray = new Mat();
Mat edge = new Mat();

//convert to gray            
if (src.Channels() == 3)
{
    Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
}
else src.CopyTo(gray);

//edge
int threshold1 = (int)numericUpDownCannyThreshold1.Value;
int threshold2 = (int)numericUpDownCannyThreshold2.Value;
Cv2.Canny(gray, edge, threshold1, threshold2);

//to get better contour
Cv2.Dilate(edge, edge, new Mat(), null, 3);
Cv2.Erode(edge, edge, new Mat(), null, 1);

//find contours
Point[][] contours;
HierarchyIndex[] hierarchyIndexes;
Cv2.FindContours(
    image: edge,
    contours: out contours,
    hierarchy: out hierarchyIndexes,
    mode: RetrievalModes.External,
    method: ContourApproximationModes.ApproxSimple);
//-- 위까지는 동일

var rectList = new List<Rect>();
foreach (var c in contours)
{
    //skip too small obj
    if (c.Length > 20)
        rectList.Add(Cv2.BoundingRect(c));
}

foreach (var rect in rectList)
{
    Cv2.Rectangle(
        img: dst,
        pt1: new Point(rect.X, rect.Y),
        pt2: new Point(rect.X + rect.Width, rect.Y + rect.Height),
        color: Scalar.Green,
        thickness: 2);
}                                             
using (new Window("edge", WindowMode.AutoSize, edge))
using (new Window("dst", WindowMode.AutoSize, dst))
{
    //Wait until user finishes (space or esc)
    while (true)
    {
        int c = Cv2.WaitKey(20);
        if ((char)c == 27 | (char)c == 32)
        {
            SetDstImage();
            Cv2.DestroyAllWindows();
            break;
        }
    }
}
canny edge / contures drawing

원 그리기

이건 나중에…

Leave a comment