Halcon实战——基于NCC模板匹配的芯片检测(附源码)

news2024/10/21 3:00:09

Halcon实战——基于NCC模板匹配的芯片检测(附源码)


关于作者


作者:小白熊

作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。

联系邮箱:xbx3144@163.com

科研辅导、知识付费答疑、个性化定制以及其他合作需求请联系作者~



  在机器视觉中,模板匹配是用于检测图像中目标物体的核心技术。归一化互相关(NCC,Normalized Cross Correlation)是模板匹配中的经典方法。它通过计算模板图像与测试图像对应区域的归一化相关系数来判断匹配程度。归一化操作的目的是消除图像亮度变化的影响,使得模板匹配对不同光照条件具有更强的鲁棒性。在芯片检测任务中,模板匹配技术尤其适用于精确定位和检测芯片上的特定图案或结构。本文结合一段Halcon代码,详细讲解如何通过NCC模板匹配完成图像中目标物体的识别。



1、图像读取

  读取模板图像和测试图像是进行图像处理的第一步。read_image 算子能够加载不同格式的图像(如 BMP、JPEG 等)。在这个示例中,我们分别加载了模板图像和待检测的测试图像。

read_image (ReferImage, 'template.bmp')
read_image (TestImage, 'test.bmp')



2、图像灰度化

  灰度图像是图像处理中的常见格式。在进行模板匹配时,将彩色图像转换为灰度图像能减少计算复杂度,从而提高匹配效率。Halcon 提供的 rgb1_to_gray 算子能够快速完成这一操作。灰度化的图像只包含亮度信息,不再包含颜色信息,这使得处理起来更加简单、快速。

rgb1_to_gray(ReferImage,ReferGrayImage)
rgb1_to_gray(TestImage,TestGrayImage)



3、定义模板区域

  模板匹配的关键之一在于选择合适的模板区域。为了更精确地进行匹配,我们可以通过 draw_rectangle1 算子手动绘制一个矩形,定义图像中需要用作模板的区域。在芯片检测任务中,如何定义模板非常关键。芯片上的很多结构可能是规则性的,定义一个合适的模板区域可以显著提高检测效率。通过手动选择芯片的关键区域作为模板,可以减少无关区域的干扰,并提高匹配的精度和速度。

draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)



4、创建NCC模板

  在 create_ncc_model 算子中,Halcon 会根据裁剪后的模板区域创建一个NCC模板。该模板能够在指定的角度范围内进行旋转匹配,使得它在寻找旋转不变的物体时表现出色。在本例中,模板在 -180° 到 180° 之间的旋转范围内进行匹配。

create_ncc_model (ImageReduced, 'auto', -rad(180), rad(180), 'auto', 'use_polarity', ModelID)



5、查找匹配

  find_ncc_model 算子通过搜索测试图像中与模板相匹配的区域,返回匹配区域的行、列坐标、角度和匹配得分。在该命令中,我们设置了匹配的最小得分为 0.5,意味着只有匹配置信度大于50%的区域才会被认为是有效匹配。此外,30 限制了最多返回 30 个匹配结果,0.5 则规定了匹配区域的重叠比例不能超过50%。

find_ncc_model (TestGrayImage, ModelID, -rad(180), rad(180), 0.5, 30, 0.5, 'true', 0, Row, Column, Angle, Score)



6、显示结果

  匹配结果通过返回的 RowColumnAngle 向量表示。如果没有匹配结果,程序将清除创建的NCC模板并退出。否则,程序将关闭当前窗口,重新打开一个用于显示测试图像的窗口,准备绘制匹配区域。找到匹配后,程序使用 gen_rectangle2() 生成矩形,以标记测试图像中的匹配区域,并通过 dev_display() 将其显示出来。每个匹配区域都会用红色边框绘制,线条宽度为 3,这使得匹配的结果直观可见。

* 如果没有找到匹配的模板
if (|Row| == 0)
    * 清除NCC模板,释放内存
    clear_ncc_model (ModelID)
    * 退出程序
    return ()
else
    * 如果找到匹配,关闭当前窗口并打开一个新的窗口显示测试图像
    dev_close_window ()
    dev_open_window (0, 0, Width*n, Height*n, 'black', WindowHandle)
    dev_display (TestImage)

    * 设置绘图模式为边缘模式
    dev_set_draw ('margin')

    * 设置绘图颜色为红色
    dev_set_color ('red')

    * 设置线条宽度为3
    dev_set_line_width (3)

    * 对每个找到的匹配位置进行绘制
    for Index := 1 to |Row| by 1
        * 生成矩形以标记在测试图像中找到的匹配区域
        gen_rectangle2 (Rectangle1, Row[Index-1], Column[Index-1], Angle[Index-1], width/2, height/2)
        * 显示矩形
        dev_display (Rectangle1)
    endfor

    * 清除NCC模板,释放内存
    clear_ncc_model (ModelID)
endif

结果



7、完整代码

* 禁用自动更新显示,避免在过程中不断刷新窗口,提高效率
dev_update_off ()

* 关闭之前可能已经打开的显示窗口,确保窗口的正确初始化
dev_close_window ()

* 读取模板图像和测试图像
read_image (ReferImage, 'template.bmp')
read_image (TestImage, 'test.bmp')

* 将模板图像和测试图像转换为灰度图像
rgb1_to_gray(ReferImage,ReferGrayImage)
rgb1_to_gray(TestImage,TestGrayImage)

* 获取模板图像的尺寸(宽度和高度)
get_image_size (ReferImage, Width, Height)

* 窗口缩放比例
n := 1.0/2

* 打开一个显示窗口,用于显示模板图像
dev_open_window (0, 0, Width*n, Height*n, 'black', WindowHandle)

* 显示参考图像
dev_display (ReferImage)

* 在窗口中手动绘制一个矩形,用于定义模板区域
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)

* 根据绘制的矩形生成一个矩形区域
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)

* 计算矩形的宽度和高度
width := Column2 - Column1
height := Row2 - Row1

* 将模板图像在矩形区域内进行裁剪,减少计算域
reduce_domain (ReferGrayImage, Rectangle, ImageReduced)

* 创建NCC(归一化互相关)模板,用于在测试图像中查找匹配
* 模板会在 -180° 到 180° 的旋转范围内进行匹配
create_ncc_model (ImageReduced, 'auto', -rad(180), rad(180), 'auto', 'use_polarity', ModelID)

* 在测试图像中查找与模板匹配的区域
find_ncc_model (TestGrayImage, ModelID, -rad(180), rad(180), 0.5, 30, 0.5, 'true', 0, Row, Column, Angle, Score)

* 如果没有找到匹配的模板
if (|Row| == 0)
    * 清除NCC模板,释放内存
    clear_ncc_model (ModelID)
    * 退出程序
    return ()
else
    * 如果找到匹配,关闭当前窗口并打开一个新的窗口显示测试图像
    dev_close_window ()
    dev_open_window (0, 0, Width*n, Height*n, 'black', WindowHandle)
    dev_display (TestImage)

    * 设置绘图模式为边缘模式
    dev_set_draw ('margin')

    * 设置绘图颜色为红色
    dev_set_color ('red')

    * 设置线条宽度为3
    dev_set_line_width (3)

    * 对每个找到的匹配位置进行绘制
    for Index := 1 to |Row| by 1
        * 生成矩形以标记在测试图像中找到的匹配区域
        gen_rectangle2 (Rectangle1, Row[Index-1], Column[Index-1], Angle[Index-1], width/2, height/2)
        * 显示矩形
        dev_display (Rectangle1)
    endfor

    * 清除NCC模板,释放内存
    clear_ncc_model (ModelID)
endif



8、总结

  NCC模板匹配是一种基于统计相关性的方法。通过计算模板与测试图像对应区域的相关系数,能够准确地定位目标位置。由于NCC对亮度变化具有较强的鲁棒性,因此特别适合在光照条件变化或图像噪声较大的环境下使用。本文通过Halcon代码演示了如何实现高效的图像匹配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2219741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第493题翻转对

题目&#xff1a; 题解&#xff1a; class Solution {public int reversePairs(int[] nums) {Set<Long> allNumbers new TreeSet<Long>();for (int x : nums) {allNumbers.add((long) x);allNumbers.add((long) x * 2);}// 利用哈希表进行离散化Map<Long, Int…

linux 效率化 - 输入法 - fcitx5

安装 Fcitx5 1. 卸载 ibus 框架 由于 ibus 和 fcitx 可能会冲突&#xff0c;先卸载 ibus&#xff08;暂未确认原因&#xff09; sudo apt remove --purge ibus2. 安装 fcitx5 输入法框架 sudo apt update sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-frontend-gtk…

深入理解Nest的REQUEST范围和TRANSIENT范围

深入理解Nest的REQUEST范围和TRANSIENT范围 单例模式REQUEST范围控制器的REQUEST范围REQUEST范围的冒泡特性场景 TRANSIENT范围例外场景 总结 单例模式 单例模式是指在整个程序执行期间&#xff0c;程序内的类都会实例化&#xff0c;且与应用程序生命周期直接相关&#xff0c;…

javax.el.PropertyNotFoundException: Property ‘XXX‘ not found on type XXX(类的路径)

捣鼓了半小时的bug 在网上找了好多方案,都没有解决 其中一个佬的解决方案:异常&#xff1a;javax.el.PropertyNotFoundException: Property xxx not found on type java.lang.String-CSDN博客 但是还是没有解决我的问题 最终解决方法,在jsp文件头部导入了类包(第三行我导入…

【Nginx系列】Nginx配置超时时间

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

MySQL日期类型选择建议

我们平时开发中不可避免的就是要存储时间&#xff0c;比如我们要记录操作表中这条记录的时间、记录转账的交易时间、记录出发时间、用户下单时间等等。你会发现时间这个东西与我们开发的联系还是非常紧密的&#xff0c;用的好与不好会给我们的业务甚至功能带来很大的影响。所以…

深入拆解TomcatJetty(二)

深入拆解Tomcat&Jetty&#xff08;二&#xff09; 专栏地址&#xff1a;https://time.geekbang.org/column/intro/100027701 1、Tomcat支持的IO模型和应用层协议 IO模型&#xff1a; NIO&#xff1a;非阻塞 I/O&#xff0c;采用 Java NIO 类库实现。NIO2&#xff1a;异…

Cyber RT 之 Timer Component 实践(apollo 9.0)

实验内容 Component 是 Cyber RT 提供的用来构建功能模块的基础类&#xff0c;Component 有两种类型&#xff0c;分别为 Component 和 TimerComponent。 相较于 Component&#xff0c;TimerComponent 不提供消息融合&#xff0c;也不由消息触发运行&#xff0c;而是由系统定时…

UE5 gameplay学习 蓝图0 level blueprint

首先在左上角这个位置可以创建一个这个蓝图 我理解这个蓝图适合做全局事件规划啥的 在场景选中一个物体&#xff0c;右侧面板拿到他&#xff0c;直接拖入蓝图&#xff0c;就能操作他了 这里获取到了这个物体&#xff0c;在gamebegin的时候把Z加了500 执行播放的时候能看见他从…

Windows API 一 ----起步

目录 1.介绍主函数入口参数。 2. 简单介绍 Windows.h 这个头文件 小结&#xff0c;也聊一聊 1.介绍主函数入口参数。 第一个参数: HINSTANCE 类型的 参数&#xff0c; 称为“实例句柄“&#xff0c;这个参数唯一标志了我们写的这个程序。 第二个参数&#xff1a; HINSTANCE…

poisson过程——随机模拟(Python和R实现)

Python实现 exponential()使用&#xff0c;自动poisson过程实现。 import numpy as np import matplotlib.pyplot as plt# Parameters lambda_rate 5 # rate parameter (events per time unit) T 10 # total time# Generate Poisson process times np.random.exponential(…

k8s系列-Rancher 上操作的k8s容器网络配置总结

Rancher 上操作的k8s容器网络配置总结 要在 Rancher 中配置Spring Boot 应用 ykhd-zhjgyw-xpwfxfjfl 服务&#xff0c;正确的配置方式如下&#xff1a; 1. 应用程序监听端口 在 application.yaml 文件中&#xff0c;配置的应用监听端口是 10001&#xff0c;并且应用的上下文…

Mycat 详细介绍及入门实战,解决数据库性能问题

一、基本原理 1、数据分片 &#xff08;1&#xff09;、水平分片 Mycat 将一个大表的数据按照一定的规则拆分成多个小表&#xff0c;分布在不同的数据库节点上。例如&#xff0c;可以根据某个字段的值进行哈希取模&#xff0c;将数据均匀的分布到不同的节点上。 这样做的好处…

美摄科技云服务解决方案,方案成熟,接入简单

美摄科技作为视频处理领域的先锋&#xff0c;凭借其强大的技术实力和深厚的行业经验&#xff0c;推出了成熟的云服务解决方案&#xff0c;为轻量化视频制作开辟了全新的道路。 一、成熟方案&#xff0c;接入无忧 美摄科技云服务解决方案的最大亮点在于其成熟度和易用性。我们…

RabbitMQ 入门(四)SpringAMQP五种消息类型(Work Queue)

一、WorkQueue(工作消息队列) Work queues&#xff0c;也被称为&#xff08;Task queues&#xff09;&#xff0c;任务模型。简单来说就是让多个消费者绑定到一个队列&#xff0c;共同消费队列中的消息。 当消息处理比较耗时的时候&#xff0c;可能生产消息的速度会远远大于…

react里实现左右拉伸实战

封装组件&#xff1a; 新建一个resizeBox.tsx文件写上代码如下&#xff1a; import React, { ReactNode, useState, useEffect, useRef } from react; import styles from "./resizeBox.less"; interface ResizableBoxProps {/*** 盒子的宽度*/widthNum?: number;…

比较相同机器上 redis和mysql分别单独承载的 最大连接数量

在相同的机器上&#xff0c;Redis 和 MySQL 的最大连接数量会受到硬件配置&#xff08;如 CPU、内存、网络等&#xff09;、配置参数和应用场景的影响。以下是对 Redis 和 MySQL 在单机环境下最大连接数的比较&#xff1a; Redis 最大连接数量 默认配置&#xff1a; Redis 默…

【2024最新版】网络安全学习路线-适合入门小白

首先说明&#xff0c;我是一名CTF的web手&#xff0c;这是我自己亲身学习网络安全的路线&#xff0c;希望能够帮到大家&#xff0c;我虽然不是大牛&#xff0c;但我也希望能够帮助一些网安小白找到自己学习的方向&#xff0c;后面有就业的详细安全技术要求&#xff0c;如果真想…

yolov8实例分隔

1.查看显卡型号 2.在https://en.wikipedia.org/wiki/CUDA上查看显卡算力&#xff0c;这里显卡为1650&#xff0c;算力为7.5 3.查看显卡算力对应的cuda版本 4slurm上该怎么办&#xff1f; 查看slurm上计算节点cuda版本 查看cuda版本 srun -A 2022099 -J job1 -p Gnode --…

【Echarts 实战指南】解锁动态历史曲线之谜

在工作中&#xff0c;大家是否曾遇到过这样一种需求呢&#xff1f;需获取设备最近 10 分钟的历史数据。设备实时数据每 2 秒推送一次&#xff0c;且要把历史数据曲线变成动态变化的状态。倘若设备最近 10 分钟的历史数据为 20 个点&#xff0c;那么现在每 2 秒就要将最前面的点…