关于halcon:Halcon例程光流法分割运动中的汽车opticalflowhdev

前言静止物体的罕用办法就是帧差法和光流法,之前以介绍了视频的两帧差法去跟踪视频中的静止物体,明天借助Halcon的例程来介绍一下光流法的原理和应用办法。 1、原理介绍光流法是利用图像序列中像素在工夫域上的变动以及相邻帧之间的相关性来找到上一帧跟以后帧之间存在的对应关系,从而计算出相邻帧之间物体的静止信息的一种办法。一般而言,光流是因为场景中前景指标自身的挪动、相机的静止,或者两者的独特静止所产生的。钻研光流场目标就是为了从图片序列中近似失去不能间接失去的运动场。光流场,是运动场在二维图像立体上(人的眼睛或者摄像头)的投影。艰深的讲,通过一个图片序列,把每张图像中每个像素的静止速度和静止方向找进去就是光流场。对于光流法的介绍、钻研局部参考以下博文:光流法介绍 2、例程正文* 序展现了如何应用optical_flow_mg算子计算图像序列中的光流以及如何宰割光流。dev_update_off ()dev_close_window ()read_image (Image1, 'xing/xing000')dev_open_window_fit_image (Image1, 0, 0, -1, -1, WindowHandle)* 设置光流矢量的显示方式dev_set_paint (['vector_field',6,1,2])dev_set_draw ('margin')for I := 1 to 587 by 1 read_image (Image2, 'xing/xing' + I$'03') *计算两幅图像中的光流 optical_flow_mg (Image1, Image2, VectorField, 'fdrig', 0.8, 1, 8, 5, 'default_parameters', 'accurate') * 二值化宰割光流区域 threshold (VectorField, Region, 1, 10000) dev_display (Image2) dev_set_color ('yellow') dev_set_line_width (1) dev_display (VectorField) dev_set_color ('green') dev_set_line_width (3) dev_display (Region) * 替换以后图为上一帧图 copy_obj (Image2, Image1, 1, 1)endfor3、外围算子解析主要参数:光流法算法Algorithm: ...

May 16, 2022 · 1 min · jiezi

关于halcon:Halcon例程增强指纹纹理的coherenceenhancingdiff

1、例程性能介绍通过应用coherence_enhancing_diff算子来实现断开指纹纹理线的加强连贯。放弃图像细节特色的同时削弱噪声。 2 、例程正文read_image (Image, 'fingerprint')get_image_size (Image, Width, Height)dev_close_window ()dev_open_window (0, 0, Width * 2, Height * 2, 'black', WindowHandle)dev_display (Image)stop ()*相干加强扩散模型,对输出图像进行各向异性扩散,加强图像中蕴含的图像构造的相干性coherence_enhancing_diff (Image, ImageCED, 0.5, 4, 0.5, 50)dev_display (ImageCED)3、外围算子解析coherence_enhancing_dif(Image : ImageCED : Sigma, Rho, Theta, Iterations :)性能:执行对输出图像的各向异性扩散过程来减少图像所蕴含的图像构造的连贯性;输出:sigma,rho都与平滑和含糊图像无关,并且这两个参数影响纹理是否连贯不间断,是否纹理较润滑Theta是迭代步长,Iterations 是迭代次数算子利用:对于纹理比拟显著的状况,能够加强纹理;当相似纹理缺点或者纹理很淡的时候,解决成果不显著,这里了解能够针对纹理显著的图像进行纹理加强和平滑。

May 9, 2022 · 1 min · jiezi

关于halcon:Halcon例程Blob分析之checkblisterhdev

1、例程介绍本例程次要展现了Halcon实现胶囊药丸的自动检测,目标是检测主动封装的药丸是否有漏装和错装。第一张图像作为参考图像,用来定位后续图像的胶囊的胶囊仓。用Blob剖析宰割的药丸并对进行分类这个实例中,用的最要害的货色是基于灰度的辨认,操作。 次要算子:仿射变换算子 :vector_angle_to_rigid,affine_trans_image形态学算子 :closing_rectangle1,opening_circle,shape_trans2、例程解析* 敞开窗体dev_close_window ()*敞开更新dev_update_off ()*读取图像read_image (ImageOrig, 'blister/blister_reference')*关上适宜图像大小的窗体dev_open_window_fit_image (ImageOrig, 0, 0, -1, -1, WindowHandle)*设置显示字体set_display_font (WindowHandle, 14, 'mono', 'true', 'false')*设置填充形式dev_set_draw ('fill')*设置线宽dev_set_line_width (3)*获取图像中的通道一的图像access_channel (ImageOrig, Image1, 1)*阈值宰割threshold (Image1, Region, 90, 255)*变换形态,整体变凸shape_trans (Region, Blister, 'convex')* 取得区域的角度、核心orientation_region (Blister, Phi)area_center (Blister, Area1, Row, Column)*求取点到点的刚性变换矩阵(仿射变换使得区域变正)vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)*仿射变换图像到参考图像affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false')*生成空对象gen_empty_obj (Chambers)for I := 0 to 4 by 1 Row := 88 + I * 70 for J := 0 to 2 by 1 Column := 163 + J * 150*生成矩形 gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30) *联结矩形(union是合几为一,原来的对象没有了。concat只是组成一个汇合,原 *来的对象还按程序放着) concat_obj (Chambers, Rectangle, Chambers) endforendfor*仿射变换区域到参考区域affine_trans_region (Blister, Blister, HomMat2D, 'nearest_neighbor')*求差集difference (Blister, Chambers, Pattern)*联结区域union1 (Chambers, ChambersUnion)*求区域与极轴的夹角orientation_region (Blister, PhiRef)PhiRef := rad(180) + PhiRef*求面积和区域核心坐标area_center (Blister, Area2, RowRef, ColumnRef)stop ()* 每一张读取到的图像都要向参考图像对齐,截取感兴趣区域Count := 6for Index := 1 to Count by 1 read_image (Image, 'blister/blister_' + Index$'02')threshold (Image, Region, 90, 255)*联通区域connection (Region, ConnectedRegions)*依据特色(这里是面积)抉择区域select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 9999999)*变换形态 shape_trans (SelectedRegions, RegionTrans, 'convex') ** 对齐图像/胶囊*求区域与极轴的夹角 orientation_region (RegionTrans, Phi) area_center (RegionTrans, Area3, Row, Column) *求以后图像到参考图像的刚性变换矩阵vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D)*仿射变换以后图像到参考图像地位 affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false') * Segment pills 宰割药片reduce_domain (ImageAffineTrans, ChambersUnion, ImageReduced)*把三通道图像更具通道分解成三幅图像decompose3 (ImageReduced, ImageR, ImageG, ImageB)*依据均匀和标准偏差剖析进行阈值宰割 var_threshold (ImageB, Region, 7, 7, 0.2, 2, 'dark')connection (Region, ConnectedRegions0)*用矩形掩码进行闭运算 closing_rectangle1 (ConnectedRegions0, ConnectedRegions, 3, 3) fill_up (ConnectedRegions, RegionFillUp) select_shape (RegionFillUp, SelectedRegions, 'area', 'and', 1000, 99999) opening_circle (SelectedRegions, RegionOpening, 4.5) connection (RegionOpening, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 99999) shape_trans (SelectedRegions, Pills, 'convex') count_obj (Chambers, Number)*生成空的谬误药片/胶囊-----共有两种谬误:错装和漏装 gen_empty_obj (WrongPill) gen_empty_obj (MissingPill)for I := 1 to Number by 1*选择对象 select_obj (Chambers, Chamber, I) *求取交加 intersection (Chamber, Pills, Pill) *求区域面积和重力核心坐标,依据面积就能够判断出是错装还是漏装 area_center (Pill, Area, Row1, Column1) if (Area > 0)*求最大最小灰度值 min_max_gray (Pill, ImageB, 0, Min, Max, Range)*依据面积和最小灰度终合判断到底是错装还是漏装 if (Area < 3800 or Min < 60)*组合谬误胶囊/药片 concat_obj (WrongPill, Pill, WrongPill) endif else *组合失落胶囊/药片 concat_obj (MissingPill, Chamber, MissingPill) endif endfor * 革除窗体dev_clear_window ()* 显示图像dev_display (ImageAffineTrans)*设置显示色彩dev_set_color ('forest green')*数药片/胶囊数量 count_obj (Pills, NumberP) count_obj (WrongPill, NumberWP)count_obj (MissingPill, NumberMP)*显示药片dev_display (Pills)*显示信息 if (NumberMP > 0 or NumberWP > 0) disp_message (WindowHandle, 'Not OK', 'window', 12, 12 + 600, 'red', 'true') else disp_message (WindowHandle, 'OK', 'window', 12, 12 + 600, 'forest green', 'true') endif * Message := '# Correct pills: ' + (NumberP - NumberWP) Message[1] := '# Wrong pills : ' + NumberWP Message[2] := '# Missing pills: ' + NumberMP * 设定各种药片显示色彩 Colors := gen_tuple_const(3,'black') if (NumberWP > 0) Colors[1] := 'red' endif if (NumberMP > 0) Colors[2] := 'red'endif*显示信息disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')*设置显示色彩 dev_set_color ('red') dev_display (WrongPill)dev_display (MissingPill)*如果索引值小于计数数量-则持续 if (Index < Count) disp_continue_message (WindowHandle, 'black', 'true') endif stop ()endfor3、例程配图图一为模板图像和阈值和形态学分隔后的胶囊感兴趣区域图二为理论检测图像成果 ...

February 24, 2022 · 2 min · jiezi

关于halcon:Qt学习实例使用键盘事件实现ESC键退出Halcon的绘图流程

1、介绍Halcon中的执行绘图算子draw_circlr或draw_rectangle1等算子在绘制图形时,单击鼠标左键进行绘图,点击右键确认图形,点击右键之前就进行期待动作,然而在MFC/Qt等开发环境下,无奈通过操作退出Halcon的过程。如果想在绘图的中途勾销,目前没有比拟间接的办法。Halcon介绍文档里只是提到通过鼠标右键完结绘图动作,在MacOS上能够应用escape键进行退出。 2、办法剖析由Halcon的帮忙文档可知,点击鼠标右键能力完结绘图动作,那咱们能够联合Qt的键盘事件,Esc触发后模仿右键后再将绘图的操作和显示复原到绘图前状态,这样就大略能实现勾销绘图的成果。其中键盘事件能够这样来定义: //申明键盘事件 void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE;而后在键盘事件实现中对键盘输入进行判断: if(event->key() == Qt::Key_Escape) { if(isQuitDraw == 0){ isQuitDraw = 1; //获取控件的鼠标地位 int btnPosX = ui->PicShow->mapToGlobal(QPoint(0, 0)).x(); int btnPosY = ui->PicShow->mapToGlobal(QPoint(0, 0)).y(); qDebug()<<"控件坐标"<<btnPosX<<btnPosY; //将鼠标挪动到指定地位 SetCursorPos(btnPosX+100,btnPosY+100); //模仿鼠标的按下和放松动作 mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0); Sleep(2); mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0); //刷新图像窗口,复原绘图变量 UpdateWindowImg(); ui->PicShow->m_IsDraw = false; SetMaskWidget(maskSignal); } } else if(event->key() == Qt::Key_Space) { qDebug()<<"按下空格"<<endl; return; } else QWidget::keyPressEvent(event);这里碰到两个问题点: 1.在绘图动作外按下Esc键触发键盘事件因为绘图动作勾销会有界面的重置等一系列动作,所以在不绘图时如果点击了Esc按键可能会呈现无操作,这里设定了一个isQuitDraw 的bool判断量,在每次绘图前开启,这样就能够保障只能在绘图的时候点击Esc按键能力触发勾销绘图动作的代码。 2.零碎自带的键盘事件会烦扰到键盘事件的执行在不设定键盘事件时,零碎有默认的键盘事件,比方Esc是返回,Enter是确认,Tab是下一个等等,因为零碎设定的是默认过滤事件event过滤事件进行散发,所以咱们在设定了键盘事件后,零碎的event仍然会有对应响应动作,这里有两种解决办法,一种是重写事件过滤器 bool eventFilter(QObject obj, QEvent e),而后给图像显示的控件装置事件过滤器。另一种办法就是重写reject。重写事件过滤器 #include <QKeyEvent> class MyEventFilter : public QObject {public: bool eventFilter( QObject *obj, QEvent *event ) override { if ( event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease ) { if ( ( (QKeyEvent *) event )->key() == Qt::Key_Space ) { qDebug("Space press!"); return true; } } return false; }};实现对事件过滤器的重写后,须要在须要拦挡的页面进行装置,如果是在子页面(子过程)中进行装置,那么它只在以后页面失效,并不会影响到别的页面,如果想在全局应用,那么就须要在第一个基页面中装置。装置是调用QObject类中的一个办法。 ...

December 16, 2021 · 1 min · jiezi

关于halcon:Halcon学习笔记实现多边形绘图后自动闭合成斜矩形

1、介绍在Halcon联合开发我的项目中,须要在Halcon窗口上绘制不同形态的ROI,然而Halcon自带的绘图操作不太不便,操作时交互感官较差,所以能够通过绘制多边形,通过点来绘制多边形,最初通过闭合算子将绘框造成闭合的xld轮廓或Region,最终失去咱们想要的ROI区域。 2、剖析画多边形轮廓是通过画点来造成多边形轮廓的,造成的图形也是不闭合的,绘制Region能够通过绘制点来造成一个闭合的Region。成果如下图所示: 3、代码实现及Qt测试其中Halcon的代码如下: draw_polygon (PolygonRegion, 200000)draw_region (Region, 200000)gen_contours_skeleton_xld (PolygonRegion, Contours, 1, 'filter')union_adjacent_contours_xld (Contours, UnionContours, 10, 1, 'attr_keep')close_contours_xld (UnionContours, ClosedContours)能够在Qt中进行对应的绘图操作,其实现的性能如下

December 16, 2021 · 1 min · jiezi

关于halcon:Halcon学习笔记机器视觉缺陷检测常用方法对比总结

1、介绍缺点检测时机器视觉需要中最简单难度较大的一类需要。究其原因,次要是在我的项目开发过程中首先要保障检测的稳定性和精度,又要实现缺点检测的通用性,常见的缺点:凹凸、污点瑕疵、划痕、裂缝、创痕、毛刺等等类型品种繁冗,缺点检测不同于尺寸、二维码、OCR辨认等算法。后者的利用场景比拟繁多,根本应用一些成熟的算法实现,最多减少一些定位、图像增强的算法,利用门槛绝对较低,也比拟容易做成通用的产品或工具。但缺点检测次要针对工业场景,不同的行业的需要和重点都有差异,这导致不同的行业所应用的缺点算法大同小异,这也注定了缺点检测被工业场景非标定制所解放。随着缺点检测要求的一直进步和技术的一直倒退,机器学习和深度学习也成了缺点畛域一个不可或缺的技术难点。 2、缺点检测目前解决方案2.1 传统算法检测缺点长处:可依据需要和图像进行不同需要的开发,可直观展现成果;毛病:调试难度大,图像变动后会导致检测算法不稳固进而须要重复调参,而且简单缺点误检的概率较大,兼容性不好,很难做成通用成果。 2.2 机器学习检测缺点个别应用相似MLP的一些单层神经网络,对缺点特色进行训练分类,该办法须要当时提取出缺点局部,个别用来与传统宰割法搭配应用,达到缺点检测分类的成果。 2.3 深度学习检测缺点长处:通用性好,能够通过迭代训练模型一直晋升某个产品的检测准确度。毛病:须要大量的数据样本(缺点样本),而且缺点品种越多,特征性越含糊,检测精度要求越高,其须要的缺点样本就越大,而且深度学习中的缺点样本须要人工去标注标签,样本越大,手动标注的工作量也越大,训练的周期也越长。只适宜产品产量大且缺点样本较多的案例。 2.4 深度学习检测缺点(迁徙学习办法)其操作方法如2.3,但同一行业或类似行业有大量的缺点样本库,如果深度训练网络具备泛化和迁徙的特点,能够在惯例缺点少的状况下,依据对立行业缺点进行迁徙学习训练,进而解决缺点样本少的问题。该办法我感觉会成为前面工业畛域检测瑕疵的一个大趋势,然而须要一些公司去收集各种行业的缺点类型图片和训练的网络模型,并共享进去,而后后来者能够应用迁徙学习的办法学习前人训练好的模型。而后一直的丰盛缺点样本和训练模型。 3、总结目前机器视觉中缺点检测次要分为以下几种: 1 Blob剖析+特征提取2 模板匹配(定位)+查分3 光度平面4 特色训练5 测量拟合6 频域+空间域7 深度学习当前的笔记中再具体介绍各种缺点检测办法应用的场景和理论案例。

September 4, 2021 · 1 min · jiezi