Esempio n. 1
0
        Seq <Point> FindPlayerContour(Image <Gray, Byte> mask)
        {
            var contourPtr = new IntPtr();

            if (tempPlayerMask == null)
            {
                tempPlayerMask = new Image <Gray, Byte>(width, height);
            }

            CvInvoke.cvCopy(mask.Ptr, tempPlayerMask.Ptr, IntPtr.Zero);
            CvInvoke.cvFindContours(tempPlayerMask.Ptr, mem.Ptr, ref contourPtr, StructSize.MCvContour,
                                    RETR_TYPE.CV_RETR_EXTERNAL, CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, new Point(0, 0));
            var contour = new Seq <Point>(contourPtr, null);

            double      maxPerim       = 0;
            Seq <Point> largestContour = null;

            for (; contour != null && contour.Ptr.ToInt32() != 0; contour = contour.HNext)
            {
                var perim = CvInvoke.cvContourPerimeter(contour.Ptr);
                if (perim > maxPerim)
                {
                    maxPerim       = perim;
                    largestContour = contour;
                }
            }
            var polyPtr = largestContour.ApproxPoly(ContourApproxLevel, mem);

            return(polyPtr);
        }