惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
云风的 BLOG
云风的 BLOG
小众软件
小众软件
V
V2EX
博客园 - Franky
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
量子位
博客园 - 【当耐特】
雷峰网
雷峰网
WordPress大学
WordPress大学
Jina AI
Jina AI
Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
Visual Studio Blog
Microsoft Security Blog
Microsoft Security Blog

博客园 - 落叶子

FreeRedis 实现消费确认队列和消费延时确认队列 快速部署单机k3s+Kuboard控制面板 解决微软鼠标设置宏后桌面有效果 进游戏就没有效果了 .net core 使用QRCoder在linux 下生成带logo的二维码 FreeScheduler 在asp.net core 中使用依赖注入的方式进行注入使用 GC 性能调优相关 maui BlazorWebView+本地html (vue、uniapp等都可以) 接入支付宝sdk 进行支付宝支付 开发 Android app maui BlazorWebView+本地html (vue、uniapp等都可以) 接入微信sdk 开发 Android app maui BlazorWebView+本地html 打包Android app 实现支付宝H5支付 maui WebView 打包Android app 实现线上网页 支付宝H5支付 maui BlazorWebView Android 中混合使用https和http 原生js+html+css 实现大转盘抽奖效果,实现人员占位,转盘缓慢停止时依次显示奖品图片 Serilog日志同步到redis中和自定义Enricher来增加额外的记录信息 c# .net 多类实现同一个接口,动态指定使用哪一个类的实现 C#、 .net 修改和移除 url 中的参数 windows 批量删除docker 镜像 uniapp 原生websocket 使用 signalr k8s docker 中部署think php 并搭建php websocket .net core Unicode 转中文
.net 中使用OpenCvSharp 判断一张图片中是否包含指定图标
落叶子 · 2023-05-04 · via 博客园 - 落叶子

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;
            }

        }


    }
}