建网站需要多钱网站建设使用的工具

张小明 2026/1/9 17:59:22
建网站需要多钱,网站建设使用的工具,正邦品牌设计公司简介,百度为什么不收录我的网站概述前面已经介绍过了OpenCV中的很多特征检测算法#xff0c;但是好像还不太清楚具体是怎么使用的#xff0c;今天以一个完整的例子介绍具体如何使用这些特征检测算法。效果#xff1a;实践读取两张图像#xff1a;// 读取图像using var img1 new Mat(FirstImagePath, Imr…概述前面已经介绍过了OpenCV中的很多特征检测算法但是好像还不太清楚具体是怎么使用的今天以一个完整的例子介绍具体如何使用这些特征检测算法。效果实践读取两张图像// 读取图像 using var img1 new Mat(FirstImagePath, ImreadModes.Color); using var img2 new Mat(SecondImagePath, ImreadModes.Color);检测关键点和计算描述符:using var descriptors1 new Mat(); usingvar descriptors2 new Mat(); usingvar matcher new BFMatcher(NormTypes.L2SQR); usingvar kaze KAZE.Create(); // 检测关键点和计算描述符 kaze.DetectAndCompute(img1, null, outvar keypoints1, descriptors1); kaze.DetectAndCompute(img2, null, outvar keypoints2, descriptors2);使用KNN匹配:// 使用KNN匹配 DMatch[][] matches matcher.KnnMatch(descriptors1, descriptors2, 2);KNNK-近邻匹配是一种基于特征点的图像匹配算法它通过计算两幅图像中特征点之间的距离为每个特征点找到K个最相似的特征点作为候选匹配对然后使用比率测试或其他筛选方法来消除错误匹配最终实现图像间的特征点对应关系建立广泛应用于图像拼接、目标识别和三维重建等计算机视觉任务中。前面我们创建了一个暴力匹配器(Brute-Force Matcher)的实例用于特征点匹配。NormTypes.L2SQR参数指定了距离计算方式为欧几里得距离的平方(L2距离的平方)这种距离度量适用于SIFT、SURF等特征描述符。查看KnnMatch的函数签名public DMatch[][] KnnMatch(Mat queryDescriptors, Mat trainDescriptors, int k, Mat? mask null, bool compactResult false)这个KnnMatch函数是OpenCV中用于执行K近邻特征匹配的核心方法它为查询描述符集合中的每个描述符找到训练描述符集合中距离最近的k个匹配项。函数返回一个二维数组DMatch[][]其中每个子数组包含对应查询描述符的k个最佳匹配结果按距离从小到大排序。KnnMatch函数参数说明:参数名类型说明queryDescriptorsMat查询图像的特征描述符矩阵每一行代表一个特征点的描述符trainDescriptorsMat训练图像的特征描述符矩阵用于与查询描述符进行匹配kint为每个查询描述符要查找的最佳匹配数量maskMat?可选掩码矩阵用于指定哪些描述符对参与匹配null表示全部参与compactResultbool决定是否压缩结果false时结果数组大小与查询描述符行数相同true时排除完全被掩码的查询描述符得到的结果如下所示进行投票唯一性// 投票唯一性 VoteForUniqueness(matches, mask); int nonZero Cv2.CountNonZero(mask); private static void VoteForUniqueness(DMatch[][] matches, Mat mask, float uniqnessThreshold 0.80f) { var maskData newbyte[matches.Length]; var maskHandle GCHandle.Alloc(maskData, GCHandleType.Pinned); using (var m Mat.FromPixelData(matches.Length, 1, MatType.CV_8U, maskHandle.AddrOfPinnedObject())) { mask.CopyTo(m); for (int i 0; i matches.Length; i) { // 这也被称为NNDR最近邻距离比率 if ((matches[i][0].Distance / matches[i][1].Distance) uniqnessThreshold) maskData[i] 255; else maskData[i] 0; } m.CopyTo(mask); } maskHandle.Free(); }这段代码实现了特征匹配中的唯一性投票机制也称为NNDR(最近邻距离比率)测试用于筛选出可靠的匹配对。对每个查询特征点的KNN匹配结果进行唯一性检验,通过比较最佳匹配与次佳匹配的距离比率来判断匹配的可靠性,默认阈值为0.80f这是经验值可根据应用场景调整。进一步过滤KNN匹配结果// 投票大小和方向 nonZero VoteForSizeAndOrientation(keypoints2, keypoints1, matches, mask, 1.5f, 20); static int VoteForSizeAndOrientation(KeyPoint[] modelKeyPoints, KeyPoint[] observedKeyPoints, DMatch[][] matches, Mat mask, float scaleIncrement, int rotationBins) { int idx 0; int nonZeroCount 0; byte[] maskMat newbyte[mask.Rows]; GCHandle maskHandle GCHandle.Alloc(maskMat, GCHandleType.Pinned); using (Mat m Mat.FromPixelData(mask.Rows, 1, MatType.CV_8U, maskHandle.AddrOfPinnedObject())) { mask.CopyTo(m); Listfloat logScale new Listfloat(); Listfloat rotations new Listfloat(); double s, maxS, minS, r; maxS -1.0e-10f; minS 1.0e10f; // 如果在这里得到异常那是因为你传入的模型和观察关键点顺序错误。只需切换顺序。 for (int i 0; i maskMat.Length; i) { if (maskMat[i] 0) { KeyPoint observedKeyPoint observedKeyPoints[i]; KeyPoint modelKeyPoint modelKeyPoints[matches[i][0].TrainIdx]; s Math.Log10(observedKeyPoint.Size / modelKeyPoint.Size); logScale.Add((float)s); maxS s maxS ? s : maxS; minS s minS ? s : minS; r observedKeyPoint.Angle - modelKeyPoint.Angle; r r 0.0f ? r 360.0f : r; rotations.Add((float)r); } } int scaleBinSize (int)Math.Ceiling((maxS - minS) / Math.Log10(scaleIncrement)); if (scaleBinSize 2) scaleBinSize 2; float[] scaleRanges { (float)minS, (float)(minS scaleBinSize Math.Log10(scaleIncrement)) }; usingvar scalesMat Mat.FromArray(logScale.ToArray()); usingvar rotationsMat Mat.FromArray(rotations.ToArray()); usingvar flagsMat new Matfloat(logScale.Count, 1); using Mat hist new Mat(); flagsMat.SetTo(new Scalar(0.0f)); float[] flagsMatFloat1 flagsMat.ToArray(); int[] histSize { scaleBinSize, rotationBins }; float[] rotationRanges { 0.0f, 360.0f }; int[] channels { 0, 1 }; Rangef[] ranges { new Rangef(scaleRanges[0], scaleRanges[1]), new Rangef(rotations.Min(), rotations.Max()) }; Mat[] arrs { scalesMat, rotationsMat }; Cv2.CalcHist(arrs, channels, null, hist, 2, histSize, ranges); Cv2.MinMaxLoc(hist, outdouble minVal, outdouble maxVal); Cv2.Threshold(hist, hist, maxVal * 0.5, 0, ThresholdTypes.Tozero); Cv2.CalcBackProject(arrs, channels, hist, flagsMat, ranges); MatIndexerfloat flagsMatIndexer flagsMat.GetIndexer(); for (int i 0; i maskMat.Length; i) { if (maskMat[i] 0) { if (flagsMatIndexer[idx] ! 0.0f) { nonZeroCount; } else maskMat[i] 0; } } m.CopyTo(mask); } maskHandle.Free(); return nonZeroCount; }通过分析匹配对之间的尺度变化和旋转角度一致性来评估匹配质量。获取匹配点// 收集好的匹配点 ListPoint2f obj new ListPoint2f(); ListPoint2f scene new ListPoint2f(); ListDMatch goodMatchesList new ListDMatch(); // 遍历掩码只提取非零项因为它们是匹配项 for (int i 0; i mask.Rows; i) { MatIndexerbyte maskIndexer mask.GetGenericIndexerbyte(); if (maskIndexer[i] 0) { obj.Add(keypoints1[matches[i][0].QueryIdx].Pt); scene.Add(keypoints2[matches[i][0].TrainIdx].Pt); goodMatchesList.Add(matches[i][0]); } } // 转换点类型 ListPoint2d objPts obj.ConvertAll(Point2fToPoint2d); ListPoint2d scenePts scene.ConvertAll(Point2fToPoint2d); private static Point2d Point2fToPoint2d(Point2f pf) { returnnew Point2d(((int)pf.X), ((int)pf.Y)); }绘制结果图像// 计算单应性矩阵 Mat homography Cv2.FindHomography(objPts, scenePts, HomographyMethods.Ransac, 1.5, mask); nonZero Cv2.CountNonZero(mask); if (homography ! null) { // 定义对象角点 Point2f[] objCorners { new Point2f(0, 0), new Point2f(img1.Cols, 0), new Point2f(img1.Cols, img1.Rows), new Point2f(0, img1.Rows) }; // 透视变换 Point2d[] sceneCorners MyPerspectiveTransform3(objCorners, homography); // 创建拼接图像 using Mat img3 new Mat(Math.Max(img1.Height, img2.Height), img2.Width img1.Width, MatType.CV_8UC3); using Mat left new Mat(img3, new Rect(0, 0, img1.Width, img1.Height)); using Mat right new Mat(img3, new Rect(img1.Width, 0, img2.Width, img2.Height)); img1.CopyTo(left); img2.CopyTo(right); // 获取掩码数组 mask.GetArray(outbyte[] maskBytes); // 绘制匹配 Cv2.DrawMatches(img1, keypoints1, img2, keypoints2, goodMatchesList, img3, Scalar.All(-1), Scalar.All(-1), maskBytes, DrawMatchesFlags.NotDrawSinglePoints); // 绘制检测到的对象边界 ListListPoint listOfListOfPoint2D new ListListPoint(); ListPoint listOfPoint2D new ListPoint { new Point(sceneCorners[0].X img1.Cols, sceneCorners[0].Y), new Point(sceneCorners[1].X img1.Cols, sceneCorners[1].Y), new Point(sceneCorners[2].X img1.Cols, sceneCorners[2].Y), new Point(sceneCorners[3].X img1.Cols, sceneCorners[3].Y) }; listOfListOfPoint2D.Add(listOfPoint2D); img3.Polylines(listOfListOfPoint2D, true, Scalar.LimeGreen, 2);
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站系统目前运行稳定室内设计师培训班多少钱

遇到一个问题,在同一主域下的多个子域之间共享登录状态的需求。例如:main.example.com 主站learn.example.com 学习中心希望在任意子域登录后,其他子域也能自动识别登录状态,包括登出同步。Cookie 跨子域共享浏览器安全策略允许 C…

张小明 2026/1/6 14:19:00 网站建设

江苏城乡建设学院网站哈尔滨cms模板建站

大家好,我是菜哥这两周,我做了一件挺有意思、也挺让我震撼的事。我拉了一个 10 人的小规模 AI 编程陪跑实战营。不是什么高手营,也不是“进阶班”,而是——真正的零基础起步。有的人从来没写过代码;有的人听到“前端”…

张小明 2026/1/7 13:40:53 网站建设

做营销网站推广m开头的可以做网站的软件

P2107 小 Z 的 AK 计划 题目描述 在小 Z 的家乡,有机房一条街,街上有很多机房。每个机房里都有一万个人在切题。小 Z 刚刷完 CodeChef,准备出来逛逛。 机房一条街有 nnn 个机房,第 iii 个机房的坐标为 xix_ixi​,小 Z …

张小明 2026/1/8 1:56:03 网站建设

网站制作南宁360度全景地图

Obsidian美化:打造你的专属知识管理空间 【免费下载链接】awesome-obsidian 🕶️ Awesome stuff for Obsidian 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-obsidian 你是否觉得Obsidian的默认界面太过朴素?想要一个既实用又…

张小明 2026/1/8 3:00:02 网站建设

设计类书籍网站免费网站软件大全

Comic Backup是一款功能强大的Chrome扩展,专门用于将在线漫画平台购买的漫画转换为标准的CBZ文件格式。无论您是想创建个人备份还是希望在不同设备间同步阅读,这款工具都能提供完美的解决方案。 【免费下载链接】comic-backup Back up your comics as CB…

张小明 2026/1/7 18:27:53 网站建设

网站建设 网站优化怎样建设网站 需要哪些条件

这篇文章系统梳理了RAG技术的28个高频面试问题,涵盖基础认知、常见问题、高级机制、RAG-Fusion、优化策略及未来展望。内容涉及RAG原理、与SFT的区别、内容缺失等问题的解决方案,以及RAG-Fusion工作机制和优化策略。文章还探讨了RAG的多模态、Agent自主检…

张小明 2026/1/8 3:02:58 网站建设