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

相关文章

C++的模板(八):子系统

平常所见的大部分模板代码,模板所传的参数类型,到了模板里面,或实例化为对象,或嵌入模板内部结构中,或在模板内又派生了子类。不管怎样,最终他们在模板内,直接或间接,都实例化成对象了。 但这不是唯一的用法。试想一下。如果在模板内限制调用参数类型的构造函数会发生什么?参数类的对象在模板内无法构造。他们只能从模板的成员函数传入。模板不保存这些对象或者只保存他们的指针。因为构造函数被分离,这些指针在模板外

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

记录AS混淆代码模板

开启混淆得先在build.gradle文件中把 minifyEnabled false改成true,以及shrinkResources true//去除无用的resource文件 这些是写在proguard-rules.pro文件内的 指定代码的压缩级别 -optimizationpasses 5 包明不混合大小写 -dontusemixedcaseclassnames 不去忽略非公共

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

时间服务器中,适用于国内的 NTP 服务器地址,可用于时间同步或 Android 加速 GPS 定位

NTP 是什么?   NTP 是网络时间协议(Network Time Protocol),它用来同步网络设备【如计算机、手机】的时间的协议。 NTP 实现什么目的?   目的很简单,就是为了提供准确时间。因为我们的手表、设备等,经常会时间跑着跑着就有误差,或快或慢的少几秒,时间长了甚至误差过分钟。 NTP 服务器列表 最常见、熟知的就是 www.pool.ntp.org/zo

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python

python 喷泉码

因为要完成毕业设计,毕业设计做的是数据分发与传输的东西。在网络中数据容易丢失,所以我用fountain code做所发送数据包的数据恢复。fountain code属于有限域编码的一部分,有很广泛的应用。 我们日常生活中使用的二维码,就用到foutain code做数据恢复。你遮住二维码的四分之一,用手机的相机也照样能识别。你遮住的四分之一就相当于丢失的数据包。 为了实现并理解foutain

python 点滴学

1 python 里面tuple是无法改变的 tuple = (1,),计算tuple里面只有一个元素,也要加上逗号 2  1 毕业论文改 2 leetcode第一题做出来

Python爬虫-贝壳新房

前言 本文是该专栏的第32篇,后面会持续分享python爬虫干货知识,记得关注。 本文以某房网为例,如下图所示,采集对应城市的新房房源数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM6Ly93aC5mYW5nLmtlLmNvbS9sb3VwYW4v 目标:采集对应城市的