当前位置: 首页 > article >正文

C# OpenCV机器视觉:利用CNN实现快速模板匹配

在一个阳光灿烂的周末,阿强正瘫在沙发上,百无聊赖地换着电视频道。突然,一则新闻吸引了他的注意:某博物馆里一幅珍贵的古画离奇失踪,警方怀疑是被一伙狡猾的盗贼偷走了,现场只留下一些模糊不清的监控画面,根本无法确定盗贼的行踪。阿强看着电视里那一团乱麻的线索,眼睛突然一亮,心中涌起一股热血:“要是我能帮警方找到盗贼,那可就太酷了!说不定还能得到博物馆的巨额悬赏,从此走上人生巅峰呢!”

说干就干,阿强立马冲进他那堆满各种电子设备和书籍的 “秘密基地”。他一边翻箱倒柜,一边嘴里嘟囔着:“我就不信了,凭我这一身的科技本领,还找不到几个毛贼!” 就在这时,他的目光落在了一台布满灰尘的电脑上,脑海中突然闪过一个念头:“对了!我可以用 OpenCvSharp 结合 CNN 来进行模板匹配,从监控画面里找出盗贼的蛛丝马迹!”

第一章:神秘的 CNN—— 图像世界的 “超级侦探”
阿强深知,要想在这复杂的图像世界里找到盗贼的线索,CNN(卷积神经网络)可是他的秘密武器。但这个 CNN 到底是何方神圣呢?阿强决定给它编一个神秘的故事,好让自己更有干劲。

“传说中,CNN 是图像世界里的一位超级侦探,它有着一双无比锐利的眼睛,能看穿图像里隐藏的所有秘密。” 阿强一边对着空气比划,一边眉飞色舞地说道,“它的大脑里装满了各种神奇的算法,就像一个藏满了魔法道具的宝库。当它面对一张图像时,就会施展它的魔法,把图像里的各种特征都提取出来,然后和它记忆中的模板进行比对,不管是多么微小的细节,都逃不过它的法眼。”

阿强越说越兴奋,仿佛自己已经成为了 CNN 的主人,带着它在图像世界里大杀四方:“比如说,我们要找一个特定的图案,CNN 就会像一个不知疲倦的寻宝者,在图像的每一个角落仔细搜寻。它会用它的魔法卷积核,一层一层地扫描图像,就像在给图像做一次深度按摩,把那些隐藏在像素背后的秘密都挖掘出来。一旦发现和模板相似的地方,它就会像发现了宝藏一样,立刻发出信号。”

第二章:筹备 “抓贼” 行动 —— 装备与知识武装
阿强决定先从监控画面里提取一些可能和盗贼有关的模板,比如他们的身形、衣着特征等。他打开电脑,启动 OpenCvSharp,开始加载监控图像和制作模板。

“嘿,老伙计,今天就靠你帮我找出那些可恶的盗贼了!” 阿强拍了拍电脑,像是在给它打气。

他小心翼翼地从监控视频中截取了几帧画面,然后用图像处理软件把盗贼的大致轮廓勾勒出来,制作成模板。“这些模板就是我们的‘通缉令’,只要盗贼在图像里出现,就别想逃过我们的追捕!” 阿强看着屏幕上的模板,信心满满地说道。

接下来,就是要把这些模板和 OpenCvSharp 里的 CNN 算法结合起来,让它们发挥出最大的威力。阿强开始编写代码,虽然他心里也有点紧张,但一想到自己即将成为英雄,就充满了动力。

阿强一边编写代码,一边在心里默默念叨:“我先把图像和模板都加载进来,就像把案件的线索和嫌疑人的画像都收集好。然后把模板标准化,让它们都有相同的尺寸,这样 CNN 才能更好地比对。接着把模板合并成一个多通道的卷积核,这就像是给 CNN 一把超级武器,让它能同时搜索多个目标。再用这个卷积核对图像进行卷积操作,就像让 CNN 在图像里进行地毯式搜索。最后,设置一个相似度阈值,只要找到的匹配度超过这个阈值,就说明我们可能找到了盗贼的踪迹!”

class CNN模板匹配
{
    static void TEST()
    {
        // 加载图像和多个模板  
        Mat image = Cv2.ImRead(@"D:\软件\core\test\Image_20240622141940849.bmp", ImreadModes.Grayscale);
        Mat template1 = Cv2.ImRead(@"D:\软件\core\template\1274.png", ImreadModes.Grayscale);
        Mat template2 = Cv2.ImRead(@"D:\软件\core\template\1282.png", ImreadModes.Grayscale);
        // 标准化模板  
        Size templateSize = new Size(33, 33);
        Cv2.Resize(template1, template1, templateSize);
        Cv2.Resize(template2, template2, templateSize);
        // 合并模板为一个多通道卷积核  
        Mat filters = new Mat();
        Cv2.Merge(new Mat[] { template1, template2 }, filters); // 合并模板为多通道  
        // 创建输出图像  
        Mat outputImg = new Mat(image.Size(), MatType.CV_8UC3);
        Cv2.CvtColor(image, outputImg, ColorConversionCodes.BGR2RGB); // 转换为 RGB 格式以便于显示 
        // 执行卷积操作  
        Mat result = new Mat();
        Cv2.Filter2D(image, result, MatType.CV_32F, filters); // 使用多通道卷积核进行卷积  
        // 设置相似度阈值  
        double similarityThreshold = 0.8;
        // 计算每个模板的参考值  
        double[] referenceValues = new double[filters.Channels()];
        for (int i = 0; i < filters.Channels(); i++)
        {
            referenceValues[i] = Cv2.Sum(filters.Split()[i])[0]; // 计算每个模板的参考值  
        }
        // 可视化所有匹配位置  
        for (int y = 0; y < result.Rows; y++)
        {
            for (int x = 0; x < result.Cols; x++)
            {
                // 获取匹配值  
                double outputValue = result.At<float>(y, x);
                // 计算相似度  
                for (int i = 0; i < referenceValues.Length; i++)
                {
                    double similarity = 1 - Math.Abs(outputValue - referenceValues[i]) / referenceValues[i];
                    // 仅在相似度超过阈值时可视化匹配位置  
                    if (similarity > similarityThreshold)
                    {
                        int centerX = x; // 圆心的 x 坐标  
                        int centerY = y; // 圆心的 y 坐标  
                        Cv2.Circle(outputImg, new Point(centerX, centerY), 2, new Scalar(179, 240, 240), thickness: 1);
                        Cv2.Rectangle(outputImg, new Rect(x, y, templateSize.Width, templateSize.Height), new Scalar(179, 240, 240), 1);
                    }
                }
            }
        }
        // 显示结果  
        Cv2.ImShow("Match Result", outputImg);
        Cv2.WaitKey(0);
        Cv2.DestroyAllWindows();
    }
}

第三章:代码冲锋 —— 让 CNN “大显身手”
代码编写完成后,阿强深吸一口气,按下了运行键。电脑屏幕上的图像开始快速闪烁,CNN 就像一个不知疲倦的侦探,在图像的每一个角落仔细搜寻着。

“快了,快了,马上就能找到那些盗贼了!” 阿强紧张地盯着屏幕,眼睛都不敢眨一下。

突然,屏幕上出现了几个绿色的圆圈和矩形,标记出了图像中与模板相似度较高的位置。阿强兴奋地跳了起来:“找到了!终于找到了!我就知道 CNN 不会让我失望的!”

他仔细查看这些标记的位置,发现有几个地方的身形和衣着特征与盗贼的模板非常相似。阿强立刻把这些信息整理成报告,发送给了警方。

第四章:真相大白 —— 阿强的 “英雄时刻”
几天后,警方传来了好消息:他们根据阿强提供的线索,成功抓获了盗贼,找回了被盗的古画。博物馆为了感谢阿强,特意举办了一场盛大的颁奖典礼,阿强一下子成了当地的名人。

“阿强,你可真是我们的大英雄啊!” 博物馆馆长握着阿强的手,激动地说道。

阿强不好意思地挠挠头:“其实我也没做什么,主要是 OpenCvSharp 和 CNN 的功劳。”

从那以后,阿强更加痴迷于 OpenCvSharp 和 CNN 的研究。他知道,这只是他在图像世界里的一次小小冒险,未来还有更多的挑战和惊喜等待着他。而他,也将继续用科技的力量,去探索这个神秘而又充满魅力的图像世界。


http://www.kler.cn/a/519579.html

相关文章:

  • Linux相关概念和易错知识点(26)(命名管道、共享内存)
  • C++ DLL注入原理以及示例
  • 非根目录部署 nextjs 项目,资源文件 请求404 的问题
  • 二叉搜索树中的众数(力扣501)
  • Synology 群辉NAS安装(4)docker-compose
  • Coze插件开发之基于已有服务创建并上架到扣子商店
  • 【JS|第29期】JavaScript中的事件类型
  • 【PySide6 快速入门】第一个QtWidget程序
  • 1_相向双指针_leetcode_16_4
  • AWS Outposts
  • 低代码系统-钉、微表单控件对比
  • VMware 的 AWS
  • 【C++高并发服务器WebServer】-5:内存映射与进程通信
  • 【中间件快速入门】什么是Redis
  • Java使用FFM API调用SDL
  • Web3与传统互联网的对比:去中心化的未来路径
  • 随机矩阵投影长度保持引理及其证明
  • 渗透测试--攻击常见的Web应用
  • Windows系统Tai时长统计工具的使用体验
  • 2D 超声心动图视频到 3D 心脏形状重建的临床应用| 文献速递-医学影像人工智能进展
  • jeecg后端登录接口
  • 提示词工程
  • 浅谈Unity中Canvas的三种渲染模式
  • python介绍ransac算法拟合圆
  • rust学习-所有权
  • MongoDB使用详解