C# 使用特征检测时,如何获取目标的位置?

C# 使用特征检测时,如何获取目标的位置?,c#,image-processing,emgucv,aforge,C#,Image Processing,Emgucv,Aforge,我是Emgucv(c#)的新程序员,我需要一些帮助 我尝试使用特征检测并遵循示例(Emgu->emgucv windesktop 4.0.1.3373->Emgu.CV.example->FeatureMatching)。它使用Kaze检测器来查找特征 我运行了这个例子,结果很好。(可以检测特征并给出特征区域) 但是,我尝试更改图像(新模型图像和从模型图像裁剪的观察图像) 新结果可以检测出特征,但特征区域不正确 我尝试使用彩色图像和灰色图像(已经更改了ImreadModes.ImageType)

我是Emgucv(c#)的新程序员,我需要一些帮助

我尝试使用特征检测并遵循示例(Emgu->emgucv windesktop 4.0.1.3373->Emgu.CV.example->FeatureMatching)。它使用Kaze检测器来查找特征

我运行了这个例子,结果很好。(可以检测特征并给出特征区域)

但是,我尝试更改图像(新模型图像和从模型图像裁剪的观察图像)

新结果可以检测出特征,但特征区域不正确

我尝试使用彩色图像和灰色图像(已经更改了ImreadModes.ImageType)

这个地区仍然不正确

那么,有人能给我一些指导或解决方案吗

    /// <summary>
    /// Draw the model image and observed image, the matched features and homography projection.
    /// </summary>
    /// <param name="modelImage">The model image</param>
    /// <param name="observedImage">The observed image</param>
    /// <param name="matchTime">The output total time for computing the homography matrix.</param>
    /// <returns>The model image and observed image, the matched features and homography projection.</returns>
    public static Mat Draw(Mat modelImage, Mat observedImage, out long matchTime)
    {
        Mat homography;
        VectorOfKeyPoint modelKeyPoints;
        VectorOfKeyPoint observedKeyPoints;
        using (VectorOfVectorOfDMatch matches = new VectorOfVectorOfDMatch())
        {
            Mat mask;
            FindMatch(modelImage, observedImage, out matchTime, out modelKeyPoints, out observedKeyPoints, matches,
               out mask, out homography);

            //Draw the matched keypoints
            Mat result = new Mat();
            Features2DToolbox.DrawMatches(modelImage, modelKeyPoints, observedImage, observedKeyPoints,
               matches, result, new MCvScalar(255, 255, 255), new MCvScalar(255, 255, 255), mask);

            #region draw the projected region on the image

            if (homography != null)
            {
                //draw a rectangle along the projected model
                Rectangle rect = new Rectangle(Point.Empty, modelImage.Size);
                PointF[] pts = new PointF[]
                {
              new PointF(rect.Left, rect.Bottom),
              new PointF(rect.Right, rect.Bottom),
              new PointF(rect.Right, rect.Top),
              new PointF(rect.Left, rect.Top)
                };
                pts = CvInvoke.PerspectiveTransform(pts, homography);

                Point[] points = new Point[pts.Length];
                for (int i = 0; i < points.Length; i++)
                    points[i] = Point.Round(pts[i]);

                using (VectorOfPoint vp = new VectorOfPoint(points))
                {
                    CvInvoke.Polylines(result, vp, true, new MCvScalar(255, 0, 0, 255), 5);
                }
            }
            #endregion

            return result;

        }
    }
}
//
///绘制模型图像和观测图像,匹配特征和单应投影。
/// 
///模型图像
///观测图像
///计算单应矩阵的输出总时间。
///模型图像和观测图像、匹配特征和单应投影。
公共静态Mat绘图(Mat modelImage、Mat ObserveImage、out long matchTime)
{
垫单应;
关键点模型关键点向量;
关键点向量观测到的关键点;
使用(VectorOfVectorOfMatch匹配=新VectorOfVectorOfMatch())
{
垫罩;
FindMatch(modelImage、observedImage、out matchTime、out modelKeyPoints、out observedKeyPoints、matches、,
外掩模,外单应);
//绘制匹配的关键点
Mat结果=新Mat();
Features2DToolbox.DrawMatches(模型图像、模型关键点、观测图像、观测关键点、,
匹配项、结果、新MCvScalar(255、255、255)、新MCvScalar(255、255、255)、掩码;
#区域在图像上绘制投影区域
if(单应性!=null)
{
//沿投影模型绘制一个矩形
矩形rect=新矩形(Point.Empty,modelImage.Size);
PointF[]pts=新的PointF[]
{
新的点F(左直,下直),
新的点F(右直,下直),
新的点F(右直,上直),
新的点F(矩形左、矩形上)
};
pts=CvInvoke.PerspectiveTransform(pts,单应性);
点[]点=新点[点长度];
对于(int i=0;i
}

示例结果:

灰度图像结果:

彩色图像结果: