【机器视觉】HALCON目标图像检测实践(零基础版非常有用!)

news2024/9/24 5:22:29

开发环境:

在这里插入图片描述

基本思路:

灰度阈值处理+特征提取
ps:思考:如何通过阈值处理后,后续缩小检测目标范围?
二值化、梯度阈值、自适应阈值等方法来增强图像的对比度,从而突出目标特征,进一步缩小检测目标范围。

实例

检测红色圆片的个数

请添加图片描述
代码实现:

read_image (Image1, 'D:/视觉图片/1.圆片.jpg')

decompose3 (Image1, Image11, Image2, Image3)

threshold (Image11, Regions, 223, 255)

fill_up (Regions, RegionFillUp)

connection (RegionFillUp, ConnectedRegions)

select_shape (ConnectedRegions,SelectedRegions, 'area', 'and', 5000, 200000)

count_obj (SelectedRegions, Number1)

area_center (SelectedRegions, Area, Row, Column)

dev_set_color ('green')
gen_cross_contour_xld (Cross, Row, Column, 100, 0)

smallest_circle (SelectedRegions, Row1, Column1, Radius)
gen_circle_contour_xld (circle, Row1, Column1, Radius, 0, 6.28318, 'positive', 1)
dev_display (Image1)
dev_set_line_width (2)
dev_set_color ('green')
dev_display (Cross)
dev_display (circle)

count_obj (circle, Number)
dev_get_window (WindowHandle)
msg:='红色目标数量: '+Number
disp_message (WindowHandle, msg, 'image', 12, 12, 'black', 'true')

disp_message (WindowHandle, '智能制造-蒋达', 'window', 50, 50, 'black', 'true')

运行结果:
在这里插入图片描述

单骰子点数

请添加图片描述
方法一:
基本思路:通过阈值处理操作(0-40)将点数和背景检测出,再通过特征处理将“圆形”的点数筛选出,然后计数即可。

代码实现:

read_image (Image1, 'D:/视觉图片/2.筛子.jpg')

decompose3 (Image1, Image11, Image2, Image3)

threshold (Image11, Regions, 0, 40)
connection (Regions, Connection)
select_shape (Connection, SelectedRegions, 'circularity', 'and', 0.47685, 0.94722)

count_obj (SelectedRegions, Number1)
area_center (SelectedRegions, Area, Row, Column)

dev_set_color ('green')
gen_cross_contour_xld (Cross, Row, Column, 20, 0.785398)

smallest_circle (SelectedRegions, Row1, Column1, Radius)
gen_circle_contour_xld (circle, Row1, Column1, Radius, 0, 6.28318, 'positive', 1)

dev_display (Image1)
dev_set_line_width (2)
dev_set_color ('green')
dev_display (Cross)
dev_display (circle)

count_obj (circle, Number)
dev_get_window (WindowHandle)
msg:='筛子点数为: '+Number
disp_message (WindowHandle, msg, 'image', 12, 12, 'black', 'true')

disp_message (WindowHandle, '智能制造-蒋达', 'window', 50, 50, 'black', 'true')

运行结果:
在这里插入图片描述

方法二:
基础思路:通过阈值处理等操作将整个骰子筛选出来,再通过定位和缩小范围将点数筛选出来,再计数即可。

代码实现:

read_image (Image2, 'D:/视觉图片/2.筛子.jpg')
decompose3 (Image2, ImageR, ImageG, ImageB)

threshold (ImageG, Regions, 87, 167)

*填充孔洞
fill_up (Regions, RegionFillUp)

*特征筛选,使用面积过滤小的干扰
select_shape (RegionFillUp, SelectedRegions, 'area', 'and', 30000, 34000)

count_obj (SelectedRegions, Number1)

* 求中心
area_center (SelectedRegions, Area, Row, Column)

*生成十字
gen_cross_contour_xld (Cross, Row, Column, 30, 0.785398)

*包围框
smallest_rectangle2 (SelectedRegions, Row1, Column1, Phi, Length1, Length2)
gen_rectangle2_contour_xld (Rectangle, Row1, Column1, Phi, Length1, Length2)

dev_display (Image2)
dev_set_line_width (2)
dev_display (Cross)
dev_display (Rectangle)
stop ()

* 定位到的筛子区域也就是点的ROI
* 缩小检测范围到ROI
reduce_domain (ImageG, SelectedRegions, ImageReduced)
threshold (ImageReduced, Regions1, 0, 90)
connection (Regions1, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 1211.06, 1410.05)
* 计数
count_obj (SelectedRegions1, Number)
dev_display (Image2)
dev_set_line_width (2)
dev_display (Cross)
dev_display (Rectangle)

msg:='筛子点数为: '+Number
dev_get_window (WindowHandle)

disp_message (WindowHandle, msg, 'image', 12, 12, 'black', 'true')

disp_message (WindowHandle, '智能制造-蒋达', 'window', 50, 50, 'black', 'true')

运行结果:
在这里插入图片描述

多骰子点数

在这里插入图片描述
基本思路:将各个骰子筛选(除背景)出来,通过循环遍历对每个单骰子进行处理和计数,即在循环中用上述单骰子的操作。

代码实现:

* 获取窗口标识符
dev_get_window (WindowHandle)
read_image (Image3, 'D:/视觉图片/3.多筛子.bmp')
decompose3 (Image3, Image1, Image2, Image31)

*分割筛子
threshold (Image2, Regions, 70, 167)

*填充孔洞,避免丢掉点
fill_up (Regions, RegionFillUp)
connection (RegionFillUp, ConnectedRegions)

*特征筛选
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20528.7, 23394.3)

*画框
smallest_rectangle2 (SelectedRegions, Row, Column, Phi, Length1, Length2)
gen_rectangle2_contour_xld (Rectangle, Row, Column, Phi, Length1, Length2)

*计算共有几个筛子
count_obj (SelectedRegions, Number)
dev_update_window ('off') //关闭窗口自动刷新
dev_display (Image3)
dev_set_line_width (2)
dev_display (Rectangle)

for Index1 := 1 to Number by 1
    select_obj (SelectedRegions, Obj, Index1)
    reduce_domain (Image2, Obj, ImageReduced)
    
    
    threshold (ImageReduced, Regions1, 0, 74)
    fill_up (Regions1, RegionFillUp1)
    connection (RegionFillUp1, ConnectedRegions1)
    
    
    select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 700, 4440)
    
    count_obj (SelectedRegions1, Number1)
    area_center (Obj, Area, Row1, Column1)
    dev_set_window (WindowHandle)
    disp_message (WindowHandle, Number1, 'image', Row1, Column1, 'black', 'true')
    stop()
    
endfor

运行结果:
在这里插入图片描述

物块集正反面检测

物块集:
在这里插入图片描述

基本思路:其实就是遍历中增加了判断,对某一次循环的图片进行阈值处理和特征处理并计数,通过数量(0 or 1)来判断有无(正反面)。

代码实现:

* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('D:/物块', ['files','follow_links','recursive'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    * Image Acquisition 01: Do something
    
    
    decompose3 (Image, ImageR, ImageG, ImageB)
    threshold (ImageR, Regions, 79, 199)
    fill_up (Regions, RegionFillUp)
    
    * 打散
    connection (RegionFillUp, ConnectedRegions)
    
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 230406, 374929)
    
    count_obj (SelectedRegions, Number)
    
    dev_display (Image)
    if (Number==0)
        * 反面
        result:='NG'
        color:='red'
    else
        * 正面
        result:='OK'
        color:='green'
        dev_set_color (color)
        area_center (SelectedRegions, Area, Row, Column)
        gen_cross_contour_xld (Cross, Row, Column, 100, 0.785398)
        smallest_rectangle2 (SelectedRegions, Row1, Column1, Phi, Length1, Length2)
        gen_rectangle2_contour_xld (Rectangle, Row1, Column1, Phi, Length1, Length2)
        dev_display (Cross)
        dev_display (Rectangle)
    endif
    dev_get_window (WindowHandle)
    disp_message (WindowHandle, result, 'image', 60, 60, color, 'true')
    
    stop ()
endfor

运行结果:
正面
在这里插入图片描述
反面
在这里插入图片描述

铭牌字符识别(水平)

请添加图片描述
基本思路:先阈值操作,提取出铭牌(除背景,但还是有一些存在),再特征处理将字符都分割出来,因为字符识别需要“白纸黑字”,需要反色处理(黑白翻转),再识别。

代码实现:

read_image (Image1Gongjian, 'D:/视觉图片/1.gongjian.png')
decompose3 (Image1Gongjian, ImageR, ImageG, ImageB)

threshold (ImageR, Regions, 64, 165)
connection (Regions, ConnectedRegions)

* 多特征筛选 面积area 高度width 宽度height

select_shape (ConnectedRegions, SelectedRegions, ['area','width','height'], 'and', [0,34.74,50.14], [5014.33,63.4,120])

*HALCON识别字符要求特征:白纸黑字

count_obj (SelectedRegions, Number)

invert_image (ImageR, ImageInvert) //黑白翻转

*排序区域
sort_region (SelectedRegions, SortedRegions, 'character', 'true', 'row')

*矩形框 平行矩形
smallest_rectangle1 (SortedRegions, Row1, Column1, Row2, Column2)

cr:=(Row1+Row2)/2.0
cc:=(Column1+Column2)/2.0

len1:=abs(Row2-Row1)/2.0
len2:=abs(Column2-Column1)/2.0

phi:=gen_tuple_const(|len2|,0)

gen_rectangle2_contour_xld (box, cr, cc, phi, len2, len1)

*读取字符模型(人工神经网络)
read_ocr_class_mlp ('Document_0-9A-Z_NoRej.omc', OCRHandle)

* 识别字符 参数:字符region 图像 模型句柄
do_ocr_multi_class_mlp (SortedRegions, ImageInvert, OCRHandle, Class, Confidence)
dev_display (Image1Gongjian)
dev_display (box)
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 18, '宋体', 'true', 'false')
disp_message (WindowHandle, '识别结果:'+sum(Class), 'image', 12, 12, 'black', 'true')
clear_ocr_class_mlp (OCRHandle)

运行结果:
在这里插入图片描述

铭牌字符识别(倾斜)

基本思路:转HSV颜色模型,矫正旋转(先求弧度再转角度),矫正后就可以开始识别字符(分割字符,特征选择,排序区域、神经网络模型)

代码实现:

dev_clear_window ()
read_image (Image, 'D:/视觉图片/2.jpg')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width/4, Height/4, 'black', WindowHandle1)
dev_display (Image)

decompose3 (Image, ImageR, ImageG, ImageB)

*转换HSV颜色模型 色调 饱和度 亮度 rgb->hsv
trans_from_rgb (ImageR, ImageG, ImageB, ImageH, ImageS, ImageV, 'hsv')

* 矫正旋转
threshold (ImageS, Regions, 170, 255)
fill_up (Regions, RegionFillUp)
connection (RegionFillUp, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 210000, 220000)

*求最小外接矩形
smallest_rectangle2 (SelectedRegions, Row, Column, Phi, Length1, Length2)
gen_rectangle2_contour_xld (Rectangle, Row, Column, Phi, Length1, Length2)

*弧度转角度
angle := deg(Phi)

*校正倾斜  角度大于0,逆时针转否则顺时针
rotate_image (ImageS, ImageRotate, 180-angle, 'constant')


*识别字符
*分割字符
threshold (ImageRotate, Regions1, 0, 100)
connection (Regions1, ConnectedRegions1)

*多特征筛选 面积高度宽度
select_shape (ConnectedRegions1, SelectedRegions1, ['area','width','height'], 'and', [0,0,31.48], [41666.7,245.37,105.56])

*排序区域
sort_region (SelectedRegions1, SortedRegions, 'character', 'true', 'column')

*读取字符模型(人工神经网络)
read_ocr_class_mlp ('Document_0-9A-Z_NoRej.omc', OCRHandle)

*识别字符 参数:字符region 图像 模型句柄
do_ocr_multi_class_mlp (SortedRegions, ImageRotate, OCRHandle, Class, Confidence)

dev_display (Image)
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 18, 'mono', 'true', 'false')
disp_message (WindowHandle, '识别结果:'+ sum(Class), 'image', 12, 12, 'black', 'true')
clear_ocr_class_mlp (OCRHandle)

运行结果:
在这里插入图片描述

铭牌字符集识别(倾斜)

倾斜铭牌字符集:
在这里插入图片描述
基本思路:首先要会单个倾斜铭牌字符集的识别,再通过遍历循环和判断展示出来

代码实现:

* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('D:/铭牌字符图像集', ['files','follow_links','recursive'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])

    * Image Acquisition 01: Do something
    
    decompose3 (Image, ImageR, ImageG, ImageB)

*转正
    *转换HSV颜色模型 色调 饱和度 亮度 rgb->hsv
    trans_from_rgb (ImageR, ImageG, ImageB, ImageH, ImageS, ImageV, 'hsv')
 
    threshold (ImageS, Regions, 170, 255)
    fill_up (Regions, RegionFillUp)
    connection (RegionFillUp, ConnectedRegions)
    
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 200000, 220000)
    
    smallest_rectangle2 (SelectedRegions, Row, Column, Phi, Length1, Length2)
    gen_rectangle2_contour_xld (Rectangle, Row, Column, Phi, Length1, Length2)
    
    angle := deg(Phi)
    
    rotate_image (ImageS, ImageRotate, 180-angle, 'constant')
    
*识别和判断
    
    threshold (ImageRotate, Regions1, 0, 100)
    connection (Regions1, ConnectedRegions1)
    
    select_shape (ConnectedRegions1, SelectedRegions1, ['area','width','height'], 'and', [0,0,31.48], [41666.7,245.37,105.56])
    count_obj (SelectedRegions1, Number)
    sort_region (SelectedRegions1, SortedRegions, 'character', 'true', 'column')
    read_ocr_class_mlp ('Document_0-9A-Z_NoRej.omc', OCRHandle)
    do_ocr_multi_class_mlp (SortedRegions, ImageRotate, OCRHandle, Class, Confidence)
    dev_display (Image)
    if (Number==11)
        * 有
        result:='OK'
        color:='green'
        dev_set_color (color)
    else
        * 无
        result:='NG'
        color:='red'
    endif
    dev_display (Image)
    dev_get_window (WindowHandle)
    set_display_font (WindowHandle, 18, 'mono', 'true', 'false')
    disp_message (WindowHandle, result, 'image', 12, 12, color, 'true')
    disp_message (WindowHandle, '识别结果:'+ sum(Class), 'image', 120, 120, 'black', 'true')
    clear_ocr_class_mlp (OCRHandle)
    stop()
endfor

运行结果:
有,且输出结果:
在这里插入图片描述
无:
在这里插入图片描述

粘连目标分割计数(瓶盖)

请添加图片描述
基本思路:采集图像-分割图像-形态学处理-显示结果

代码实现:

dev_update_on ()
dev_get_window (WindowHandle)
read_image (Image, 'D:/视觉图片/瓶盖.jpg')
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions, 50, 255)

*去除干扰,毛刺 孤立的小点
opening_circle (Regions, RegionOpening, 3.5)

*腐蚀断开连接
erosion_circle (RegionOpening, RegionErosion, 45.5)

*分割连通域
connection (RegionErosion, ConnectedRegions)

*注意:connection之后使用opening erosion,可能存在空区域,要谨慎(必要时使用select_shape选择)
* erosion_circle (ConnectedRegions, RegionErosion1, 60.5)

*膨胀瓶盖
dilation_circle (ConnectedRegions, RegionDilation, 4.5)


*计数
count_obj (RegionDilation, Number)

*确定中心
area_center (RegionDilation, Area, Row, Column)
*标记中心
dev_set_colored (12)
gen_cross_contour_xld (Cross, Row, Column, 15, 0)
dev_set_draw ('margin')
dev_set_line_width (2)

*设置窗口显示字体 窗口句柄 字号 字体 粗体 斜体
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_clear_window ()
dev_display (Image)
*dev_display (RegionIntersection)
dev_display (Cross)
disp_message (WindowHandle, '数量是:'+Number, 'image', 12, 12, 'black', 'true')

运行结果:
在这里插入图片描述

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

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

相关文章

对话永洪科技CEO何春涛:专注BI,决胜AI时代丨数据猿专访

大数据产业创新服务媒体 ——聚焦数据 改变商业 大数据、云计算、人工智能为代表的新一代信息技术走向普及,数据驱动业务,逐渐成为现代化企业管理、运作的日常。对于年均复合增长率超过20%的国内商业智能(BI)市场而言&#xff0c…

OpenHarmony 应用 ArkUI 状态管理开发范例

本文转载自《#2023 盲盒码 # OpenHarmony 应用 ArkUI 状态管理开发范例》,作者:zhushangyuan_ 本文根据橘子购物应用,实现 ArkUI 中的状态管理。 在声明式 UI 编程框架中,UI 是程序状态的运行结果,用户构建了一个 UI …

技术奇瑞高能出击,四大品牌联袂燃擎成都车展

8月25日,成都国际汽车展览会于中国西部国际博览城正式拉开帷幕。成都车展作为西南地区首屈一指的国内四大A级车展之一,不仅是下半年国内车市的风向标,也因天府之国弥漫着火锅味与茶香的烟火气而独具一番风味。成都车展上,奇瑞集团…

【校招VIP】前端算法考点之大数据相关

考点介绍: 大数据的关键技术分为分析技术和处理技术,可用于大数据分析的关键技术主要包括A/B测试,关联规则挖掘,数据挖掘,集成学习,遗传算法,机器学习,自然语言处理,模式…

17.看楼房

Description 小张在暑假时间进行了暑期社会调查。调查的内容是楼房的颜色如何影响人们的心情。于是他找到了一个楼房从左到右排成一排的小区,这个小区一共有 栋楼房,每个楼房有一个颜色 和一个高度 。小张调查的内容为每次他站在第 栋楼和第 栋楼之间向…

2240. 买钢笔和铅笔的方案数

文章目录 Tag题目来源题目解读解题思路复杂度分析写在最后 Tag 【枚举】【数学】 题目来源 2240. 买钢笔和铅笔的方案数 题目解读 现在你有一笔钱 total,用来购买钢笔和铅笔,它们的价格分别为 cost1 和 cost2,试问你可以有多少种不同的购…

CASAIM与北京协和医院达成合作,通过CT重建和3D打印技术为医学实验提供技术辅助和研究样本

近期,CASAIM与北京协和医院达成合作,通过CT重建和3D打印技术为医学实验提供技术辅助和研究样本,在实验样本的一致性和实验研究的严谨性原则下设计方案,推动产学研一体化发展。 北京协和医院是集医疗、教学、科研于一体的现代化综合…

【Tkinter系列04/15】界面小部件(选择钮、行编辑器)

九. 小部件Checkbutton 复选框小部件(有时称为 “复选框”)是允许用户阅读和 选择双向选项。上图显示了如何 复选按钮在关闭 (0) 和打开 (1) 状态下查看 实现:这是两个复选按钮的屏幕截图 使用 …

C#基础详解

Excerpt C#是微软公司发布的一种面向对象的、运行于 .NET Framework和 .NET Core(完全开源,跨平台)之上的高级程序设计语言。- C#是一种安全的、稳定的、简单的、优雅的,由C和C衍生出来的面向对象的编程语言。它在继承C和C强大功能…

threejs加载file格式的gltf模型,使用input type=file加载gltf模型

项目场景: 使用input选择gltf加载模型 问题描述 gltf有多个文件如何塞给GLTFLoader加载(不知道怎么办)。 解决方案: 最后在threejs官网看到解决办法 解决思路 URL.createObjectURL(bolb/file) 1:input输入文件获…

HummerRisk V1.4.0发布

大家好,HummerRisk 1.4.0和大家见面了,在这个版本中我们变更了多云检测的底层逻辑,增加了每次检测的project概念,更好的去支持检测历史和检索需要,增加阿里云最佳实践中资源监控检测规则,增加资源态势中的细…

TypeScript_队列结构-链表

队列 队列(Queue),它是一种受限的线性表,先进先出(FIFO First In First Out) 受限之处在于它只允许在队列的前端(front)进行删除操作而在队列的后端(rear)进…

python后端,一个账户,多设备登录管理

一个账号,多台设备同时登陆的问题,设计以及实现 参考这篇文章: https://www.alibabacloud.com/help/zh/tair/use-cases/manage-multi-device-logon-from-a-single-user-by-using-tairhash1.0 设计思路 利用的是Redis,主设备的保…

Webgoat-Hijack a session通关答题教程

Webgoat-Hijack a session Hijack session是会话劫持,先了解需要用到的知识: Cookie原理: 1.客户端向服务端发起请求 2.服务端返回cookie,自己也保存了一份 3.客户端收到后,将cookie也保存起来 4.客户端再次发起请求时…

某物联网数智化园区行业基于 KubeSphere 的云原生实践

公司简介 作为物联网 数智化园区一体化解决方案提供商,我们致力于为大中型园区、停车场提供软硬件平台,帮助园区运营者实现数字化、智能化运营。 在使用 K8s 之前我们使用传统的方式部署上线,使用 spug(一款轻量级无 Agent 的自…

算术化电路中如何使用定制gates?

1. 引言 现有ZKP证明系统中,除关注proof size和verification time之外,Prover Time是一个重要瓶颈。 当侧重Prover Time时,可考虑STARK方案。并借助recursive STARKSNARK,来获得small proof。 Prover Time: 直接取…

【VM】保姆级VM算法平台二次开发之-环境配置

VM算法平台二次开发 1.下载Visual Studio 20222.项目的创建 C# 应用3.设置属性,去掉属选型32位4. 进行引用的导入工作5. 重新加载,查看引用6. 工具箱添加Dll的依赖。(只需要加载一次就行) 1.下载Visual Studio 2022 可以直接在官…

PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像问题深度学习优化实践技术应用

我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…

未来芯片设计领域的药明康德——青芯如何在N个项目间游走平衡

总部位于上海张江的青芯半导体(CyanSemi),ASIC定制设计是其核心业务之一。 青芯在单纯的设计服务维度之上,打造了从设计到生产的一套完整ASIC定制业务,不仅做芯片设计,还提供封装、测试服务,也…

ikuai配置内外网及动态域名,外部可以直接通过域名进行访问私网的网络服务环境。

1.安装ikuai虚拟机,这里可以自行百度,网上一堆教程用vm安装ikuai 2.重要的,配置网卡, 先上图在说。下图是虚拟机配置了两个网卡, 第一个网卡vmnet0配置为自动桥接模式。 第二个网卡vmnat1配置为NAT模式。 配置前需要…