沈阳网站建设公司电话深圳 网站建设培训
2026/4/4 4:17:17 网站建设 项目流程
沈阳网站建设公司电话,深圳 网站建设培训,广州网络公司政策,成都高端网站建设前言今天来学习一下OpenCVSharp中最佳匹配矩形检测的例子。其过程可以分为ORB特征检测、特征匹配、最佳匹配筛选、单应性计算与矩形绘制。效果#xff1a;实践ORB特征检测进行ORB特征检测#xff1a;using var img1 new Mat(FirstImagePath, ImreadModes.Color); usingvar i…前言今天来学习一下OpenCVSharp中最佳匹配矩形检测的例子。其过程可以分为ORB特征检测、特征匹配、最佳匹配筛选、单应性计算与矩形绘制。效果实践ORB特征检测进行ORB特征检测using var img1 new Mat(FirstImagePath, ImreadModes.Color); usingvar img2 new Mat(SecondImagePath, ImreadModes.Color); usingvar orb ORB.Create(1000); usingvar descriptors1 new Mat(); usingvar descriptors2 new Mat(); orb.DetectAndCompute(img1, null, outvar keyPoints1, descriptors1); orb.DetectAndCompute(img2, null, outvar keyPoints2, descriptors2);ORBOriented FAST and Rotated BRIEF是一种快速高效的特征检测算法它结合了FAST关键点检测器和BRIEF描述符并添加了旋转不变性和尺度不变性能够在保持较高匹配精度的同时提供极快的计算速度特别适合实时应用和移动设备上的计算机视觉任务。查看ORB.Create方法public static ORB Create(int nFeatures 500, float scaleFactor 1.2f, int nLevels 8, int edgeThreshold 31, int firstLevel 0, int wtaK 2, ORBScoreType scoreType ORBScoreType.Harris, int patchSize 31, int fastThreshold 20) { NativeMethods.HandleException(NativeMethods.features2d_ORB_create(nFeatures, scaleFactor, nLevels, edgeThreshold, firstLevel, wtaK, (int)scoreType, patchSize, fastThreshold, out var returnValue)); return new ORB(returnValue); }ORB.Create() 方法是OpenCV中用于创建ORB特征检测器的静态工厂方法它提供了多个参数来定制ORB检测器的行为参数名默认值含义说明nFeatures500要保留的最大特征点数量scaleFactor1.2f金字塔缩放比率大于1。scaleFactor2表示经典金字塔每下一层比上一层少4倍像素nLevels8金字塔层数。最小层尺寸等于输入图像尺寸/pow(scaleFactor, nlevels-firstLevel)edgeThreshold31不检测特征的边界区域大小应大致匹配patchSize参数firstLevel0放置源图像的金字塔层级之前的层级用上采样的源图像填充wtaK2生成定向BRIEF描述符每个元素所需的点数。默认值2表示取随机点对比较亮度输出0/1响应scoreTypeHarris特征点评分类型。Harris_SCORE表示使用Harris算法对特征排序FAST_SCORE是稍快但不太稳定的替代方案patchSize31定向BRIEF描述符使用的补丁大小在较小的金字塔层上特征覆盖的感知图像区域会更大fastThreshold20FAST角点检测的阈值再来看下DetectAndCompute方法public virtual void DetectAndCompute(InputArray image, InputArray? mask, out KeyPoint[] keypoints, OutputArray descriptors, bool useProvidedKeypoints false) { ThrowIfDisposed(); if (image null) { thrownew ArgumentNullException(image); } if (descriptors null) { thrownew ArgumentNullException(descriptors); } image.ThrowIfDisposed(); mask?.ThrowIfDisposed(); using VectorOfKeyPoint vectorOfKeyPoint new VectorOfKeyPoint(); NativeMethods.HandleException(NativeMethods.features2d_Feature2D_detectAndCompute(ptr, image.CvPtr, Cv2.ToPtr(mask), vectorOfKeyPoint.CvPtr, descriptors.CvPtr, useProvidedKeypoints ? 1 : 0)); keypoints vectorOfKeyPoint.ToArray(); GC.KeepAlive(this); GC.KeepAlive(image); GC.KeepAlive(mask); descriptors.Fix(); GC.KeepAlive(descriptors); }DetectAndCompute 是OpenCV中特征检测器类的核心方法用于在图像中检测关键点特征点并计算这些点的描述符。这是计算机视觉中特征匹配、物体识别、图像拼接等应用的基础。查看参数含义参数名类型含义imageInputArray输入的灰度图像大多数特征检测器要求单通道灰度图像maskInputArray?可选的掩码用于指定在图像的哪些区域检测特征keypointsout KeyPoint[]输出的关键点数组包含检测到的关键点信息descriptorsOutputArray输出的描述符包含每个关键点的描述符useProvidedKeypointsbool是否使用提供的关键点查看得到的关键点数组特征匹配进行汉明特征匹配using var bf new BFMatcher(NormTypes.Hamming, crossCheck: true); var matches bf.Match(descriptors1, descriptors2);汉明匹配是一种基于汉明距离的二进制特征描述符匹配方法通过计算两个二进制字符串之间不同位的数量来衡量相似度主要用于ORB、BRISK、FREAK等二进制特征描述符的快速匹配。相比传统的欧几里得距离匹配汉明匹配具有计算速度快、内存占用小的优势只需简单的位运算和计数操作特别适合实时应用和移动设备场景。在OpenCV中通常使用BFMatcher配合NormTypes.Hamming来实现通过设置距离阈值如ORB通常为30-70来筛选最佳匹配广泛应用于特征匹配、物体识别和图像拼接等计算机视觉任务中。查看BFMatcher类的这个构造函数public BFMatcher(NormTypes normType NormTypes.L2, bool crossCheck false) { NativeMethods.HandleException(NativeMethods.features2d_BFMatcher_new((int)normType, crossCheck ? 1 : 0, out ptr)); detectorPtr null; }BFMatcherBrute-Force Matcher暴力匹配器是OpenCV中用于特征描述符匹配的基础类它通过遍历所有可能的描述符对来找到最佳匹配。参数名类型默认值含义normTypeNormTypesNormTypes.L2距离度量类型用于计算描述符之间的相似度crossCheckboolfalse是否启用交叉验证确保匹配的对称性再来看下Match方法public DMatch[] Match(Mat queryDescriptors, Mat trainDescriptors, Mat? mask null) { ThrowIfDisposed(); if (queryDescriptors null) { thrownew ArgumentNullException(queryDescriptors); } if (trainDescriptors null) { thrownew ArgumentNullException(trainDescriptors); } using VectorOfDMatch vectorOfDMatch new VectorOfDMatch(); NativeMethods.HandleException(NativeMethods.features2d_DescriptorMatcher_match1(ptr, queryDescriptors.CvPtr, trainDescriptors.CvPtr, vectorOfDMatch.CvPtr, Cv2.ToPtr(mask))); GC.KeepAlive(this); GC.KeepAlive(queryDescriptors); GC.KeepAlive(trainDescriptors); GC.KeepAlive(mask); return vectorOfDMatch.ToArray(); }Match 是OpenCV中描述符匹配器的核心方法用于在两组描述符之间找到最佳匹配对。这是特征匹配流程中的关键步骤将查询描述符与训练描述符进行一对一匹配。参数名类型默认值含义queryDescriptorsMat-查询描述符集合通常来自第一幅图像trainDescriptorsMat-训练描述符集合通常来自第二幅图像maskMat?null可选掩码用于指定哪些描述符对可以匹配返回的是DMatch结构体数组查看这个结构体属性名类型含义QueryIdxint查询描述符索引指向查询描述符集合中的第几个描述符TrainIdxint训练描述符索引指向训练描述符集合中的第几个描述符ImgIdxint训练图像索引当有多个训练图像时指定匹配来自哪个图像Distancefloat两个描述符之间的距离值越小表示匹配质量越好选取最好的10个匹配var goodMatches matches .OrderBy(x x.Distance) .Take(10) .ToArray();提取这些关键点坐标var srcPts goodMatches.Select(m keyPoints1[m.QueryIdx].Pt).Select(p new Point2d(p.X, p.Y)); var dstPts goodMatches.Select(m keyPoints2[m.TrainIdx].Pt).Select(p new Point2d(p.X, p.Y));计算单应性矩阵using var homography Cv2.FindHomography(srcPts, dstPts, HomographyMethods.Ransac, 5, null);查看FindHomography方法public static Mat FindHomography(IEnumerablePoint2d srcPoints, IEnumerablePoint2d dstPoints, HomographyMethods method HomographyMethods.None, double ransacReprojThreshold 3.0, OutputArray? mask null, int maxIters 2000, double confidence 0.995) { if (srcPoints null) { thrownew ArgumentNullException(srcPoints); } if (dstPoints null) { thrownew ArgumentNullException(dstPoints); } Point2d[] obj (srcPoints as Point2d[]) ?? srcPoints.ToArray(); Point2d[] array (dstPoints as Point2d[]) ?? dstPoints.ToArray(); NativeMethods.HandleException(NativeMethods.calib3d_findHomography_vector(obj, obj.Length, array, array.Length, (int)method, ransacReprojThreshold, ToPtr(mask), maxIters, confidence, outvar returnValue)); GC.KeepAlive(mask); mask?.Fix(); returnnew Mat(returnValue); }FindHomography 是OpenCV中用于计算最佳透视变换矩阵的核心方法它能够找到将源平面点映射到目标平面点的单应性矩阵。这是计算机视觉中图像配准、拼接和三维重建的基础算法。参数名类型默认值含义srcPointsIEnumerable-原始平面中的点坐标集合dstPointsIEnumerable-目标平面中的点坐标集合methodHomographyMethodsHomographyMethods.None计算单应性矩阵的方法ransacReprojThresholddouble3.0RANSAC方法中允许的最大重投影误差maskOutputArray?null可选输出掩码标记内点和外点maxItersint2000RANSAC最大迭代次数confidencedouble0.995置信水平范围0-1HomographyMethods 选项:方法值含义适用场景HomographyMethods.None普通最小二乘法数据质量好无外点HomographyMethods.RansacRANSAC算法存在外点和噪声HomographyMethods.Lmeds最小中值法外点比例适中HomographyMethods.RhoRHO算法对外点鲁棒性强int h img1.Height, w img1.Width; var img2Bounds new[] { new Point2d(0, 0), new Point2d(0, h-1), new Point2d(w-1, h-1), new Point2d(w-1, 0), }; var img2BoundsTransformed Cv2.PerspectiveTransform(img2Bounds, homography);定义图像边界然后变换图像边界。public static Point2d[] PerspectiveTransform(IEnumerablePoint2d src, Mat m) { if (src null) { thrownew ArgumentNullException(src); } if (m null) { thrownew ArgumentNullException(m); } using MatPoint2d mat Mat.FromArray(src); using MatPoint2d mat2 new MatPoint2d(); NativeMethods.HandleException(NativeMethods.core_perspectiveTransform_Mat(mat.CvPtr, mat2.CvPtr, m.CvPtr)); GC.KeepAlive(m); return mat2.ToArray(); }PerspectiveTransform 是OpenCV中用于执行透视变换的核心方法它能够对二维或三维点集合应用透视变换矩阵实现坐标系的转换。这是图像几何变换中的基础操作广泛应用于图像校正、拼接和增强现实等领域。矩形绘制using var view img2.Clone(); var drawingPoints img2BoundsTransformed.Select(p (Point)p).ToArray(); Cv2.Polylines(view, new[] { drawingPoints }, true, Scalar.Red, 3);查看Polylines方法public static void Polylines( Mat img, IEnumerableIEnumerablePoint pts, bool isClosed, Scalar color, int thickness 1, LineTypes lineType LineTypes.Link8, int shift 0) { if (img isnull) thrownew ArgumentNullException(nameof(img)); if (pts isnull) thrownew ArgumentNullException(nameof(pts)); img.ThrowIfDisposed(); var ptsList new ListPoint[](); var nptsList new Listint(); foreach (var pts1 in pts) { var pts1Arr pts1.ToArray(); ptsList.Add(pts1Arr); nptsList.Add(pts1Arr.Length); } var ptsArr ptsList.ToArray(); var npts nptsList.ToArray(); var ncontours ptsArr.Length; usingvar ptsPtr new ArrayAddress2Point(ptsArr); NativeMethods.HandleException( NativeMethods.imgproc_polylines_Mat( img.CvPtr, ptsPtr.GetPointer(), npts, ncontours, isClosed ? 1 : 0, color, thickness, (int) lineType, shift)); GC.KeepAlive(img); }Polylines 是OpenCV中用于绘制一个或多个多边形曲线的绘图函数。它可以在图像上绘制连续的线段形成闭合或开放的多边形形状是计算机视觉中可视化检测结果、标注区域和绘制轮廓的重要工具。参数名类型默认值含义imgMat-目标图像要在其上绘制多边形ptsIEnumerableIEnumerable-多边形点集合的集合每个内层集合代表一个多边形isClosedbool-是否闭合多边形true表示闭合false表示开放colorScalar-绘制颜色BGR格式thicknessint1线条粗细正数表示粗细负数表示填充lineTypeLineTypesLineTypes.Link8线条类型抗锯齿算法shiftint0坐标点的小数位数

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询