/// <summary>
 /// Compute the descriptor given the image and the point location
 /// </summary>
 /// <param name="image">The image where the descriptor will be computed from</param>
 /// <param name="keyPoints">The keypoint where the descriptor will be computed from. Keypoints for which a descriptor cannot be computed are removed.</param>
 /// <returns>The descriptors founded on the keypoint location</returns>
 public Matrix<Byte> ComputeDescriptorsRaw(Image<Gray, Byte> image, VectorOfKeyPoint keyPoints)
 {
     const float epsilon = 1.192092896e-07f;        // smallest such that 1.0+epsilon != 1.0
      keyPoints.FilterByImageBorder(image.Size, 48 / 2 + 9 / 2); //this value comes from opencv's BriefDescriptorExtractor::computeImpl implementation
      keyPoints.FilterByKeypointSize(epsilon, float.MaxValue);
      int count = keyPoints.Size;
      if (count == 0) return null;
      Matrix<Byte> descriptors = new Matrix<Byte>(count, DescriptorSize, 1);
      CvBriefDescriptorComputeDescriptors(_ptr, image, keyPoints, descriptors);
      Debug.Assert(keyPoints.Size == descriptors.Rows);
      return descriptors;
 }