C# 使用特征检测时,如何获取目标的位置?
我是Emgucv(c#)的新程序员,我需要一些帮助 我尝试使用特征检测并遵循示例(Emgu->emgucv windesktop 4.0.1.3373->Emgu.CV.example->FeatureMatching)。它使用Kaze检测器来查找特征 我运行了这个例子,结果很好。(可以检测特征并给出特征区域) 但是,我尝试更改图像(新模型图像和从模型图像裁剪的观察图像) 新结果可以检测出特征,但特征区域不正确 我尝试使用彩色图像和灰色图像(已经更改了ImreadModes.ImageType) 这个地区仍然不正确 那么,有人能给我一些指导或解决方案吗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)
/// <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
}
示例结果:
灰度图像结果:
彩色图像结果: