首页 > 其他分享 >.net 中使用OpenCvSharp 判断一张图片中是否包含指定图标

.net 中使用OpenCvSharp 判断一张图片中是否包含指定图标

时间:2023-05-04 19:35:13浏览次数:37  
标签:Mat Cv2 maxLoc source OpenCvSharp using net 图标

1. 添加包引用

<ItemGroup>
    <PackageReference Include="OpenCvSharp4" Version="4.7.0.20230115" />
    <PackageReference Include="OpenCvSharp4.Extensions" Version="4.7.0.20230115" />
    <PackageReference Include="OpenCvSharp4.runtime.win" Version="4.7.0.20230115" />
  </ItemGroup>

2.具体代码

using OpenCvSharp;
using OpenCvSharp.Extensions;
using OpenCvSharp.XFeatures2D;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading.Tasks;
using Point = OpenCvSharp.Point;

namespace ConsoleApp9
{
    internal class Program
    {
        static void Main(string[] args)
        {


            var isFind = FindPicFromImage(@"C:\Users\63537\Desktop\新建文件夹 (2)\douyinda.jpg", @"C:\Users\63537\Desktop\新建文件夹 (2)\新建文件夹\douyin2.png");
            if (isFind)
            {
                Console.WriteLine("找到");
            }
            else
            {
                Console.WriteLine("未找到");
            }

            Console.ReadKey();

        }
        /// <summary>
        /// 查找一张图片中是否包含指定图标
        /// </summary>
        /// <param name="sourceImgPath">源图</param>
        /// <param name="picImgPath">要查找的图标</param>
        /// <param name="threshold">准确度(越接近1准确度越高)</param>
        /// <param name="imgWidth">源图宽度(在源图上截取指定图标时源图的宽度,后期可能要对比的源图大小会不一样,例如同一个画面在不同手机下的截图大小应该不一样,这时要指定一个尺寸作为对比)</param>
        /// <returns></returns>
        public static bool FindPicFromImage(string sourceImgPath, string picImgPath, double threshold = 0.9, double imgWidth = 0)
        {
            try
            {
                
                using Mat source = new Mat(sourceImgPath);
                if (imgWidth != 0)
                {
                    //如果源图宽度不等于对比图的宽度则按照指定宽度等比例缩放(提高识别率)
                    if (source.Width != imgWidth)
                    {
                        Cv2.Resize(source, source, new OpenCvSharp.Size(imgWidth, imgWidth * source.Height / (double)source.Width));
                    }
                }

                using Mat pic = new Mat(picImgPath, ImreadModes.AnyColor);
                using Mat result = new Mat();
                //模板匹配
                Cv2.MatchTemplate(source, pic, result, TemplateMatchModes.CCoeffNormed);
                Point minLoc, maxLoc;
                double minValue, maxValue;
                Cv2.MinMaxLoc(result, out minValue, out maxValue, out minLoc, out maxLoc);
                Console.WriteLine(maxValue);
                if (maxValue >= threshold)
                {
                    using Mat mask = source.Clone();
                    //画框显示
                    Cv2.Rectangle(mask, maxLoc, new Point(maxLoc.X + pic.Cols, maxLoc.Y + pic.Rows), Scalar.Green, 2);
                    Cv2.ImShow("mask", mask);
                    Cv2.WaitKey(0);
                    Cv2.DestroyAllWindows();
                    return true;

                }
                else
                {

                    return false;
                }
            }
            catch (Exception ex)
            {
                return false;
            }

        }


    }
}

 

标签:Mat,Cv2,maxLoc,source,OpenCvSharp,using,net,图标
From: https://www.cnblogs.com/lkd3063601/p/17372266.html

相关文章

  • springboot 分析源码欢迎页和图标-> thymeleaf模板引擎常用语法->扩展
    欢迎页: icon: 注意点: thymeleaf模板引擎1.使用thymeleaf模板引擎前要导入对应依赖包2.阅读源码:根据源码说明我们可以将html文件放置在templates目录下,然后通过controller进行跳转即可 controller类://在templates下的东西需要通过controller类来跳转,//需要导入......
  • csdn.net 的搜索功能
    在博客左边的文章搜索mupdf:结果都是一些不相干的讯息该好好改善一下搜索功能了。......
  • 【解决方法】解决锐捷EVE模拟器无法弹出选择CRT接管命令行和命令行,提示:此站点正在尝试
    环境:工具:锐捷EVE模拟器,火狐游览器(Firefox)远程工具:SecureCRT系统版本:Windows10问题描述:描述:在Edge游览器和360游览器中,启动路由器等设备无法启动命令行和CRT,弹出框中无反应。如下图:解释:游览器不兼容,安装火狐游览器即可。解决方法:1.下载火狐游览器:https://www.firefo......
  • .Net6基于IdentityServer4配置服务授权以及策略授权
    在上一篇中,配置了认证授权服务。这篇配置接口访问时进行授权新建一个名为Web.API.Test的.Net6项目,引用包源IdentityServer4.AccessTokenValidationProgram注入usingMicrosoft.AspNetCore.Authentication.JwtBearer;usingMicrosoft.IdentityModel.Tokens;builder.Service......
  • MySQL 8.0半同步复制-net_flush()失败
    MySQL8.0.26做的增强半同步复制,log-error日志中出现如下报错:2021-12-28T14:04:24.663005+08:0011[ERROR][MY-011161][Repl]Semi-syncmasterfailedonnet_flush()beforewaitingforreplicareply.2021-12-28T14:51:49.217811+08:00413824[ERROR][MY-011161][Repl......
  • netty第一个程序,简单聊天程序
    netty第一个程序,简单聊天程序。server端和client端分别定义一个消息处理类ChatServerHandlerpublicclassChatServerHandlerextendsSimpleChannelInboundHandler<String>{privatestaticChannelGroupchannelGroup=newDefaultChannelGroup(GlobalEventExecutor.I......
  • .net 随机端口
    使用TcpListener获取一个可用的端口publicstaticintGetRandomPort(){varlistener=newTcpListener(IPAddress.Any,0);listener.Start();varport=((IPEndPoint)listener.LocalEndpoint).Port;listener.St......
  • k8s Kubernetes Dashboard 安装与使用
    https://github.com/kubernetes/dashboardhttps://developer.aliyun.com/article/745086https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.mdhttps://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/web-ui-......
  • netstat命令端口状态
    TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态......
  • 自动驾驶图像全景分隔,基于HRnetSegmentation从训练工程到tensorRT工程部署Demo闭环一
    自动驾驶图像全景分隔,基于HRnetSegmentation从训练工程到tensorRT工程部署Demo闭环一套,包含训练工程及部署工程,和环境的配置说明,已在实际项目中使用。大厂自动驾驶工程师沉淀实实在在的工作经验总结资料是一线自动驾驶工程师辛苦工作的结果。ID:3150671806789047......