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;
}