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

2023-12-11 05:20

本文主要是介绍Python 调用 Halcon 模板匹配实现目标定位,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、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 osdef 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 windowif __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 1read_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)endifdev_disp_text ('耗时:'+Time, 'image', 50, 50, 'black', [], [])stop ()
endfor

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

在这里插入图片描述

绿色框为目标区域。

三、Python 实现上述检测过程

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

import halcon as ha
import osdef 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 windowdef 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()

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

这篇关于Python 调用 Halcon 模板匹配实现目标定位的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/479572

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核