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

news2024/11/18 16:24:55

开发环境:

在这里插入图片描述

基本思路:

灰度阈值处理+特征提取
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/956225.html

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

相关文章

净利同比大增158%,国民内衣都市丽人已显“飞轮效应”

作者 | 曾响铃 文 | 响铃说 自2021年底创始人郑耀南回归开启“二次创业”后,都市丽人变革效果显著,稳健经营之路“渐入佳境”,好消息不断。 最新的半年财报,更是延续了这一点。最新财报显示,2023年上半年&#xff0…

基于AI智能分析网关EasyCVR视频汇聚平台关于能源行业一体化监控平台可实施应用方案

随着数字经济时代的到来,实体经济和数字技术深度融合已成为经济发展的主流思路。传统能源行业在运营管理方面也迎来了新的考验和机遇。许多大型能源企业已开始抓住机遇,逐步将视频监控、云计算、大数据和人工智能技术广泛应用于生产、维护、运输、配送等…

8.31 加载资源文件 信号与槽机制

登录窗口 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this -> setFixedSize(540, 410); //固定窗口大小this -> setWindowTitle("啊啊啊"…

比较opencv,pillow,matplotlib,skimage读取图像的速度比

上面这些库都被广泛用于图像处理和计算机视觉任务; 不同的图像读取库(OpenCV,Pillow,matplotlib和skimage)的读取速度,是怎么样的一个情况? 下面分别从读取速度,以及转换到RGB通道…

文心一言向全社会开放

大家好,我是洋子 今天和大家宣传一件令人激动的事情 8月31日,文心一言率先向全社会全面开放。广大用户可以在应用商店下载“文心一言APP”或登陆“文心一言官网(https://yiyan.baidu.com)体验。同时,企业用户可以直接登陆百度智能云千帆大模…

云渲染平台是如何收费的?

现在的云渲染平台实在太多了,那么多平台,他们都是如何收费的呢?这篇文章我们就一块来看看吧。 一、渲染100(http://www.xuanran100.com?ycode1a12) 渲染100位于成都,是国内知名的云渲染公司,15分钟2毛60分钟8毛非常适…

《Flink学习笔记》——第十二章 Flink CEP

12.1 基本概念 12.1.1 CEP是什么 1.什么是CEP? 答:所谓 CEP,其实就是“复杂事件处理(Complex Event Processing)”的缩写;而 Flink CEP,就是 Flink 实现的一个用于复杂事件处理的库&#xff08…

Java之API详解之BigDecimal类的详细解析

7 BigDecimal类 7.1 引入 首先我们来分析一下如下程序的执行结果: public class BigDecimalDemo01 {public static void main(String[] args) {System.out.println(0.09 0.01);}} 这段代码比较简单,就是计算0.09和0.01之和,并且将其结果…

模拟电子技术基础学习笔记三 PN结

采用不周的掺杂工艺,将P型半导体与N型半导体制作在同一块硅片上,在它们的交界面就形成PN结。 扩散运动 物质总是从浓度高的地方向浓度低的地方运动,这种由于浓度差而产生的运动称为扩散运动。 空间电荷区 - 耗尽层 漂移运动 在电场力的作…

【马蹄集】第二十四周——高精度计算专题

高精度计算专题 目录 MT2191 整数大小比较MT2192 AB problemMT2193 A-B problemMT2194 大斐列MT2195 升级版斐波那契数列MT2196 2的N次幂 MT2191 整数大小比较 难度:黄金    时间限制:1秒    占用内存:128M 题目描述 给出两个正整数&…

邮件群发的功能优势

动态IP切换登录发送 保证送达率 软件可自动切换不同的动态拨号VPS的IP,登录不同的第三方免费邮件发送方,模拟真实环境,一个IP登录一个小号邮件账号发送,这样可以绕过因为一个IP同时登录同个第三方免费邮箱的不同账户而造成的屏蔽&…

HUAWEI华为笔记本MateBook 16 2021款 锐龙版 R7 集显(CREM-WFD9)原厂Win10系统

华为原装出厂系统自带指纹、显卡、声卡、网卡等所有驱动、出厂主题壁纸LOGO、Office办公软件、华为电脑管家等预装程序 链接:https://pan.baidu.com/s/18XIYnasYFfLxSKS6LfoHvw?pwdly6j 提取码:ly6j

WOFOST模型与PCSE模型应用丨数据准备,模型参数解读与设置,模型运行与结果输出,模型结果解读与决策支持等

目录 专题一 理论基础 专题二 数据准备 专题三 WOFOST模型基础 专题四 PythonCropSimulationEnvironment 专题五 案例拓展 更多应用 WOFOST(WorldFoodStudies)和PCSE(PythonCropSimulationEnvironment)是两个用于农业生产模…

安装使用electron

一、安装node和npm 运行cmd查看是否安装及版本号 npm -v node -v 二、安装electron npm直接安装会报错缺少什么文件,使用cnpm进行安装 直接安装cnmp后,再用cnmp命令安装可能会报错Error: Cannot find module ‘node:util’ 原因是npm版本与cnpm版本…

高中学历,月薪3000服务员,用四个月“改命”进国企,变身网络安全工程师

最近几年,不少年轻人都感到非常焦虑,压力大,迷茫。在时代变迁的洪流中,如何获得内心的平静呢? ——成长。 “只有认知突破,才能带来真正的成长。”这是雷军在8月14日年度演讲中提到的,近十年来…

OPENCV实现计算描述子

1、计算描述子 kp,des = sift.computer(img,kp) 2、其作用是进行特征匹配 3、同时计算关键点和描述 3.1、kp,des = sift.detectAnd Computer(img,...)

kali更换gnome并自定义登录界面

文章目录 安装gnome修改登录界面 Gnome是linux下比较好看的一款Linux图形化界面,发现网上的教程很多各式各样,有些还是错误的不能正确更换,或者不能修改登录界面 安装gnome 我们只需要执行sudo apt install gnome命令即可。 这个过程会花费很…

包含文心一言在内的首批国产大模型 全面开放

8月31起,国内 11 家通过《生成式人工智能服务管理暂行办法》备案的 AI 大模型产品将陆续上线,面向全社会开放。北京 5 家大模型产品分别是百度的 “文心一言”、抖音的 “云雀”、百川智能的 “百川大模型”、清华系 AI 公司智谱华章旗下的 “智谱清言”…

为什么过早的优化是万恶之源

为什么过早的优化是万恶之源? 缘起 Donald Knuth(高德纳) 是一位计算机科学界的著名学者和计算机程序设计的先驱之一。他被誉为 计算机科学的“圣经”《计算机程序设计艺术》的作者 ,提出了著名的“大O符号”来描述算法的时间复杂度和空间…

ABB PCD231B通信输入/输出模块

多通道输入和输出: PCD231B 模块通常配备多个输入通道和输出通道,用于连接传感器、执行器和其他设备。 通信接口: 这种模块通常支持各种通信接口,如以太网、串口(RS-232、RS-485)、Profibus、CAN 等&#…