public VectorOfPointF Detect(Image<Gray, byte> image, int innerCornersPerChessboardCols,
            int innerCornersPerChessboardRows)
        {
            var corners = new VectorOfPointF();

            CvInvoke.FindChessboardCorners(image, new Size(innerCornersPerChessboardCols, innerCornersPerChessboardRows),
                corners);

            if (corners.Size != innerCornersPerChessboardCols*innerCornersPerChessboardRows)
            {
                return new VectorOfPointF(new[] {new PointF(0, 0)});
            }

            var refinedCorners = new[] {corners.ToArray()};

            image.FindCornerSubPix(refinedCorners, new Size(11, 11), new Size(-1, -1), new MCvTermCriteria(10));

            return new VectorOfPointF(refinedCorners[0]);
        }