Python 调用 Halcon 模板匹配实现目标定位

news2024/11/28 6:25:03

一、Halcon

当谈及计算机视觉领域中强大的工具和框架时,Halcon(由德国MVTec 公司开发)无疑是一个备受关注的系统。Halcon被广泛用于工业视觉和机器视觉应用中,其强大的功能和灵活性使其成为许多开发人员和研究人员的首选选择。

Halcon的独特之处在于其高度优化的图像处理算法和丰富的功能库。它提供了丰富的工具和函数,可以用于解决各种复杂的图像处理问题,包括形状识别、特征提取、匹配、测量和分类、以及深度学习等。其高性能的图像处理算法和优化的数据结构使得在处理大规模图像数据时能够快速而有效地进行分析和处理。

Halcon还支持多种编程语言,包括C、C++、C#Python等,这使得开发人员可以根据自己的偏好和需求选择合适的编程语言来进行应用开发。其丰富的文档和示例代码也为开发者提供了便利,加速了开发过程。

使用 Python 开发时,需要确保电脑上已经安装了 Halcon 环境,并在环境变量进行了如下配置:

HALCONROOT: Halcon 安装位置,默认情况下为:C:\Program Files\MVTec\HALCON-22.11-Steady

Path 中追加如下变量:

;%HALCONROOT%\bin\x64-win64

然后安装 Python 依赖:

pip install mvtec-halcon==22111.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

注意:版本号要和电脑安装的 Halcon 版本一致:

在这里插入图片描述

然后在 Python 中调用 Halcon 也是非常简单,算子和 Halcon 工具中高度保持一致,例如:

import halcon as ha
import os

def open_window(width, height, row=0, col=0):
    if os.name == 'nt':
        ha.set_system('use_window_thread', 'true')
    window = ha.open_window(
        row=row,
        column=col,
        width=width,
        height=height,
        father_window=0,
        mode='visible',
        machine=''
    )
    ha.set_draw(window, 'fill')
    ha.set_line_width(window, 2)
    ha.set_color(window, 'red')
    return window

if __name__ == '__main__':
    # 读取图像
    image = ha.read_image("printer_chip/printer_chip_01")
    # 阈值分割
    region = ha.threshold(image, 128, 255)
    # 开启一个窗口
    window = open_window(500, 500)
    # 展示图像
    ha.disp_obj(image, window)
    ha.disp_obj(region, window)
    ha.wait_seconds(5)


在这里插入图片描述

下面以口罩图像中定位编号为例:

在这里插入图片描述

由于编号会有变化,可以以下面的 CE 为模版,然后每次通过模版定位编号的位置:

在这里插入图片描述

二、使用 Halcon 实现过程

首先使用 Halcon 实现过程,然后再转换到 Python 中。

创建模版:

dev_get_window (WindowHandle)
dev_set_draw ('margin')
dev_set_line_width (2)
dev_set_color ('red')

read_image (Image, 'face_masks/face_mask_01')

* 模版区域
gen_rectangle2 (ROI, 616.5, 708.5, rad(-82.4054), 50, 35)
write_region (ROI, 'D:/halcon/test/ROI.hobj')

* 目标区域
gen_rectangle2 (ROI_0, 725.847, 792.482, rad(-83.3001), 236.754, 32.7044)
write_region (ROI_0, 'D:/halcon/test/ROI_0.hobj')

reduce_domain (Image, ROI, ImageReduced)

* 创建 ncc 模型
create_ncc_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 'use_polarity', ModelID)

write_ncc_model (ModelID,'D:/halcon/test/de.ncm')

下面使用上面创建的模版检测图像:

dev_get_window (WindowHandle)
dev_set_draw ('margin')
dev_set_line_width (2)

* 读取ncc模版
read_ncc_model ('C:/Users/16058/Desktop/de.ncm', ModelID)
* 读取模版目标区域
read_region (ROI, 'D:/halcon/test/ROI.hobj')
* 读取目标区域
read_region (ROI_0, 'D:/halcon/test/ROI_0.hobj')

smallest_rectangle2 (ROI, Row1, Column1, Phi1, Length1, Length2)
smallest_rectangle2 (ROI_0, Row2, Column2, Phi2, Length11, Length21)

NumImages := 5
for Index := 1 to NumImages by 1
    read_image (Image, 'face_masks/face_mask_' + Index$'02')

    count_seconds (T0)
    * 模版检测
    find_ncc_model (Image, ModelID, rad(0), rad(360), 0.7, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
    count_seconds (T1)
    Time := (T1 - T0) 
    
    dev_clear_window ()
    dev_display (Image)
    if (|Score| > 0)
        * 刚性仿射变换
        vector_angle_to_rigid (Row1, Column1, 0, Row, Column, Angle, HomMat2D)
        * 转换得到目标区域
        affine_trans_region (ROI, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
        affine_trans_region (ROI_0, RegionAffineTrans1, HomMat2D, 'nearest_neighbor')
        
        dev_set_color ('red')
        dev_display (RegionAffineTrans)
        dev_set_color ('green')
        dev_display (RegionAffineTrans1)
    endif
    dev_disp_text ('耗时:'+Time, 'image', 50, 50, 'black', [], [])
    stop ()
endfor

运行后可以得到如下结果:

在这里插入图片描述

绿色框为目标区域。

三、Python 实现上述检测过程

Python 中算子通过 halcon 库直接调用即可。

import halcon as ha
import os

def open_window(width, height, row=0, col=0):
    if os.name == 'nt':
        ha.set_system('use_window_thread', 'true')
    window = ha.open_window(
        row=row,
        column=col,
        width=width,
        height=height,
        father_window=0,
        mode='visible',
        machine=''
    )
    ha.set_draw(window, 'margin')
    ha.set_line_width(window, 2)
    ha.set_color(window, 'red')
    return window

def detection():
    # 读取ncc模版
    model_id = ha.read_ncc_model('D:/halcon/test/de.ncm')
    # 读取模版目标区域
    roi = ha.read_object('D:/halcon/test/ROI.hobj')
    # 读取目标区域
    roi_0 = ha.read_object('D:/halcon/test/ROI_0.hobj')
    row1, column1, phi1, length1, length2 = ha.smallest_rectangle2(roi)

    for i in range(1, 6):
        image = ha.read_image(f"face_masks/face_mask_0{i}.png")
        # 模版检测
        t0 = ha.count_seconds()
        row, column, angle, score = ha.find_ncc_model(image, model_id, 0.0, 6.28319, 0.7, 1, 0.5, 'true', 0)
        t1 = ha.count_seconds()
        time = (t1 - t0)
        print(f"耗时:{time}")

        if (len(score) > 0):
            # 刚性仿射变换
            hom_mat_2d = ha.vector_angle_to_rigid(row1, column1, 0, row, column, angle)
            # 转换得到目标区域
            region_affine_trans = ha.affine_trans_region(roi, hom_mat_2d, 'nearest_neighbor')
            region_affine_trans1 = ha.affine_trans_region(roi_0, hom_mat_2d, 'nearest_neighbor')
            # 展示结果
            window = open_window(500, 500)
            ha.disp_obj(image, window)
            ha.set_color(window, 'red')
            ha.disp_obj(region_affine_trans, window)
            ha.set_color(window, 'green')
            ha.disp_obj(region_affine_trans1, window)
            ha.wait_seconds(2)

if __name__ == '__main__':
    detection()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【合集】SpringBoot——Spring,SpringBoot,SpringCloud相关的博客文章合集

前言 本篇博客是spring相关的博客文章合集,内容涵盖Spring,SpringBoot,SpringCloud相关的知识,包括了基础的内容,比如核心容器,springMVC,Data Access;也包括Spring进阶的相关知识&…

支持大模型训练的计算机系统

摘要: 训练数据决定了基础大模型可用的理论信息,模型架构和训练目标决定了可以提取多少信息,计算机系统决定了实际可实现的内容。在数据和模型大小方面,系统是扩展的关键瓶颈,这两者似乎都可以可靠地跟踪能力的改进。在…

Bypass open_basedir

讲解 open_basedir是php.ini中的一个配置选项,可用于将用户访问文件的活动范围限制在指定的区域。 假设open_basedir/var/www/html/web1/:/tmp/,那么通过web1访问服务器的用户就无法获取服务器上除了/var/www/html/web1/和/tmp/这两个目录以外的文件。…

【网络安全】vulhub靶场搭建与一个漏洞的简单示例

vulhub是一个经典的靶场,里面大约包含了200个不同的漏洞,可以说是安全从业者必刷。 无需docker知识,简单执行一条命令即可编译、运行一个完整的漏洞靶场镜像。 我的环境是CentOS 7。 先安装docker sudo curl -L "https://github.com…

Linux-帮助命令的使用和练习(type、man、help、info详解)

目录 5.3.1 type-判断是否为内部命令 5.3.2 man-查看详细文档 5.3.3 help-查看shell内部命令的帮助信息 5.3.4 --help-查看系统外部命令帮助信息 5.3.5 info-查看info格式的帮助指令 5.3.6 /usr/share/doc-存储软件包的文档信息 平时我们看到的命令大多数都可以查看帮助文…

Redis有序集合对象

一.编码 有序集合的编码可以是ziplist或者skiplist。 ziplist编码的有序集合对象使用压缩列表作为底层实现,每一个集合元素使用紧挨在一起的两个压缩列表节点来保存。第一个节点保存元素的成员(member),而第二个元素则保存元素的分值(score)。 127.0.0.…

全面解析“由于找不到hid.dll,无法继续执行代码”的4个解决方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“找不到hid.dll”。这个问题通常出现在尝试运行某个程序或访问某个设备时。那么,当我们遇到这个问题时,应该如何解决呢?本文将详细介绍找不到hid.dll的解…

Java第二十一章总结

网络编程三要素 ip地址:计算机在网络中的唯一标识 端口:应用程序在计算机中唯一标识 协议:通信协议,常见有UDP和TCP协议 InetAddress类 表示Internet协议地址 //返回InetAddress对象 InetAddress byName InetAddress.…

程序员的养生之道

程序员的养生之道 1 对程序员的初次印象2 我的养生之道2.1 规律作息:2.2 合理饮食:2.3 健康饮食:2. 4 增强锻炼:2. 5 心态平和:2. 6 生活习惯:2.7 定期体检:2.8 特殊注意:2.9 补充能…

Zookeeper系统性学习-应用场景以及单机、集群安装

Zookeeper 是什么? Zookeeper 为分布式应用提供高效且可靠的分布式协调服务,提供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。在解决分布式数据一致性方面,ZooKeeper 并没有直接采用 Paxos 算法,而是采用了名为 …

微表情检测(三)----基于光流特征的微表情检测

Micro-expression spotting based on optical flow features 基于光流特征的微表情检测 Abstract 本文提出了一种高精度和可解释性的自动微表情检测方法。首先,我们设计了基于鼻尖位置的图像对齐方法,以消除由头部晃动引起的全局位移。其次&#xff0…

C# Winform 日志系统

目录 一、效果 1.刷新日志效果 2.单独日志的分类 3.保存日志的样式 二、概述 三、日志系统API 1.字段 Debug.IsScrolling Debug.Version Debug.LogMaxLen Debug.LogTitle Debug.IsConsoleShowLog 2.方法 Debug.Log(string) Debug.Log(string, params object[]) …

lv12 系统移植导学 1

1 导学 Kernel学习主要包括三块内容,ARM(汇编、协议)、系统移植、驱动移植 lv12主要时安装系统linux linux主要帮我们实现了5大功能 1 进程、线程管理 2 内存管理 3 网络协议栈管理 4 文件系统管理 5 设备管理 2 移植的目的 不同架构…

ptmalloc:从内存虚拟化说起

前言 本文并不局限于ptmalloc的原理,而是从linux的内存虚拟化和系统调用原理出发,结合各种语言实现,讲明内存分配方面的trade off,力图事无巨细,追根究底。本文内容包括但不限于:NIO原理、0拷贝原理、内存…

AirServer 5.63中文破解2024最新图文安装激活教程含许可证

AirServer是一款便捷式投屏软件,它的主要功能在于实时地将移动设备上的图像画面内容投放到电脑设备上,让电脑成为iPad、iPhone等iOS系统设备的大屏显示器。 在设备之间建立局域网内的信号发送与接收通道,确保数据可以稳定安全地进行传输。下面…

大模型对数据分布变化的鲁棒性研究综述

摘要: 标准机器学习的一个主要限制是它产生的模型对分布变化不鲁棒,其中训练分布与测试分布不匹配(对于下游任务)。现有的工作表明,调整在广泛的未标记数据上训练的基础模型可以提高适应模型在各种变化中的鲁棒性。这为…

【Java 基础】28 字符编码

文章目录 1.字符集2.编码方式1)ASCII2)UTF-8 编码3)UTF-16 编码4)ISO-8859-1 编码 3.使用样例Charset 类String 类 4.注意事项结语 字符编码(Character Encoding)是一种将字符映射为二进制数据的规则或算法…

如何理解 RPC 远程服务调用?

本文主要讲解 RPC 远程服务调用相关的知识。 RPC 远程服务调用是分布式服务架构的基础,无论微服务设计上层如何发展,讨论服务治理都绕不开远程服务调用,那么如何理解 RPC、有哪些常见的 RPC 框架、实现一款 RPC 框架需要哪些技术呢&#xff…

macos下安装科研绘图软件Origin

科研人必备软件Origin,主要是考虑到很多期刊都要求绘制origin可编辑的图,所以有些时候必须用这个软件,但是这个软件macos并不支持,所以必须考虑其他的方案,我没有安装虚拟机,而是使用crossover 安装crosso…

Vue 静态渲染 v-pre

v-pre 指令&#xff1a;用于阻止 Vue 解析这个标签&#xff0c;直接渲染到页面中。 语法格式&#xff1a; <div v-pre> {{ 数据 }} </div> 基础使用&#xff1a; <template><h3>静态渲染 v-pre</h3><p v-pre>静态渲染&#xff1a;{{ n…