首页 > 其他分享 >计算不同金字塔级别下图像匹配所需的时间

计算不同金字塔级别下图像匹配所需的时间

时间:2024-08-17 19:27:22浏览次数:13  
标签:图像匹配 image dev window set 图像 金字塔 级别 display

下述代码是使用 HALCON 软件编写的,HALCON 是一款用于机器视觉和图像分析的高级软件。代码的目的是创建一个由两张图像拼接而成的图像马赛克(mosaic),并计算不同金字塔级别下图像匹配所需的时间。

ImgPath := ‘3d_machine_vision/mosaic/’
ImgName := ‘bga_r_’
Times := []
Colors := [‘red’,‘coral’,‘yellow’,‘lime green’]
read_image (Images, ImgPath + ImgName + [‘01’,‘06’])
dev_update_off ()
dev_close_window ()
dev_open_window_fit_size (0, 0, 640, 980, 320, 490, WindowHandle)
dev_open_window_fit_size (0, 330, 490, 490, 1000, 490, WindowHandle1)
set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
set_display_font (WindowHandle1, 14, ‘mono’, ‘true’, ‘false’)

  • The internal camera parameters of the used camera
  • (necessary to eliminate radial distortions)
    CamParam := [0.0121693,-2675.63,7.40046e-006,7.4e-006,290.491,258.887,640,480]
    change_radial_distortion_cam_par (‘adaptive’, CamParam, 0, CamParOut)
    change_radial_distortion_image (Images, Images, Images, CamParam, CamParOut)
  • To show the point matches that are used to compute the
  • transformation between the images, we will show both images in a
  • tiled image with some space between the images so that the extents
  • of the images are easily visible.
    tile_images_offset (Images, TiledImage, [0,500], [0,0], [-1,-1], [-1,-1], [-1,-1], [-1,-1], 640, 980)
  • Now we can determine the transformations between the image pairs.
    From := 1
    To := 2
    select_obj (Images, ImageF, From)
    select_obj (Images, ImageT, To)
  • Repeat the calculation 4 times with a different number of pyramid levels
    for NumLevels := 1 to 4 by 1
    *
    dev_clear_window ()
    dev_set_window (WindowHandle)
    dev_clear_window ()
    dev_display (TiledImage)
    disp_message (WindowHandle, [‘Calculate point matches’,‘with ’ + NumLevels + ’ pyramid levels’,‘Please wait …’], ‘window’, 20, 10, ‘black’, ‘true’)
    *
    • Calculate the projection between the two images
    • Check the procedure’s comments for details
      count_seconds (S1)
      proj_match_points_ransac_pyramid (ImageF, ImageT, NumLevels, RowFAll, ColFAll, RowTAll, ColTAll, ProjMatrix, Points1, Points2)
      count_seconds (S2)
      Times := [Times,S2 - S1]
    • Display point correspondences
      gen_cross_contour_xld (PointsF, RowFAll, ColFAll, 6, rad(45))
      gen_cross_contour_xld (PointsT, RowTAll + 500, ColTAll, 6, rad(45))
      RowF := subset(RowFAll,Points1)
      ColF := subset(ColFAll,Points1)
      RowT := subset(RowTAll,Points2) + 500
      ColT := subset(ColTAll,Points2)
      gen_empty_obj (Matches)
      for K := 0 to |RowF| - 1 by 1
      gen_contour_polygon_xld (Match, [RowF[K],RowT[K]], [ColF[K],ColT[K]])
      concat_obj (Matches, Match, Matches)
      endfor
      dev_display (TiledImage)
      dev_set_color (‘blue’)
      dev_display (Matches)
      dev_set_color (‘green’)
      dev_display (PointsF)
      dev_display (PointsT)
      disp_message (WindowHandle, [|RowF| + ’ point matches’,‘Time used: ’ + (S2 - S1)$’.3’ + ’ s’], ‘window’, 20, 10, ‘black’, ‘true’)
    • Generate the mosaic image
      gen_projective_mosaic (Images, MosaicImage, 1, From, To, ProjMatrix, [2,1], ‘false’, MosaicMatrices2D)
    • Display mosaic image
      get_image_size (MosaicImage, Width, Height)
      dev_set_window (WindowHandle1)
      dev_resize_window_fit_image (MosaicImage, 0, 330, [400,700], 700)
      dev_clear_window ()
      dev_display (MosaicImage)
      disp_message (WindowHandle1, ‘Projective mosaic (used ’ + NumLevels + ’ pyramid levels)’, ‘window’, 20, 10, ‘black’, ‘true’)
      disp_continue_message (WindowHandle1, ‘black’, ‘true’)
      stop ()
      endfor
  • Display execution times
    dev_set_window (WindowHandle)
    dev_close_window ()
    MaxTime := max(Times)
    BaseRow := 380
    RectHeight := 300
    disp_message (WindowHandle1, [‘Time in s:’,‘(#levels used)’], ‘image’, BaseRow + 20, 10, ‘black’, ‘true’)
    for Index := 0 to |Times| - 1 by 1
    gen_rectangle1 (Rectangle, BaseRow - RectHeight * Times[Index] / MaxTime, 200 + Index * 100, BaseRow, 280 + Index * 100)
    disp_message (WindowHandle1, [Times[Index]$‘.3’,‘(’ + (Index + 1) + ‘)’], ‘image’, BaseRow + 20, 200 + 100 * Index, ‘black’, ‘true’)
    dev_set_color (Colors[Index])
    dev_set_draw (‘fill’)
    dev_display (Rectangle)
    endfor
    disp_finished_message (WindowHandle1, ‘black’, ‘true’)
    bga_r_01.png
    在这里插入图片描述
    bga_r_06.png
    在这里插入图片描述
    bga_r_01.png
    在这里插入图片描述
    bga_r_02.png
    在这里插入图片描述
    bga_r_03.png
    在这里插入图片描述
    bga_r_04.png
    在这里插入图片描述
    以下是代码的主要步骤和功能:

定义图像路径和名称:

ImgPath 定义了图像的存储路径。
ImgName 定义了图像的基本名称。
初始化变量:

Times 用于存储不同金字塔级别下图像匹配所需的时间。
Colors 定义了用于显示不同级别时间的矩形的颜色。
读取图像:

使用 read_image 函数读取路径和名称组合的图像。
关闭和打开显示窗口:

dev_close_window 关闭当前窗口。
dev_open_window_fit_size 打开并调整窗口大小以适应图像。
设置显示字体:

set_display_font 设置窗口的显示字体。
相机参数:

CamParam 包含相机的内部参数,用于消除径向畸变。
图像畸变校正:

change_radial_distortion_image 函数用于校正图像的径向畸变。
图像拼接:

tile_images_offset 函数将两张图像拼接在一起,以便在计算图像之间的变换时更容易看到图像的范围。
图像匹配:

使用 proj_match_points_ransac_pyramid 函数在不同金字塔级别下计算图像匹配。
显示匹配点:

使用 gen_cross_contour_xld 函数生成交叉轮廓来显示匹配点。
生成马赛克图像:

gen_projective_mosaic 函数根据计算出的投影矩阵生成马赛克图像。
显示马赛克图像:

调整窗口大小以适应马赛克图像,并显示它。
显示执行时间:

计算并显示不同金字塔级别下图像匹配所需的时间。
绘制时间条形图:

使用 gen_rectangle1 函数绘制时间条形图,并使用不同的颜 ** 分不同级别的时间。
显示完成消息:

disp_finished_message 函数在窗口中显示完成消息。
代码中的注释提供了详细的步骤说明,有助于理解每个函数的作用和整个图像处理流程。

标签:图像匹配,image,dev,window,set,图像,金字塔,级别,display
From: https://blog.csdn.net/zhangyy57/article/details/141147391

相关文章

  • java opencv 图像匹配识别
    //region图像匹配3.0privateMatimageMatch(Imageori,Imagetbi){System.setProperty("java.awt.headless","false");System.out.println(System.getProperty("java.library.path"));URLurl=ClassLoader.getSystem......
  • 【开端】Java中Log级别和解析
    一、绪论Java系统中需要对日志进行输出,方便定位系统访问信息,系统报错信息,用于排查系统问题等。我们常常使用的日志有一下一些级别publicinterfaceLog{ booleanisDebugEnabled(); booleanisTraceEnabled(); voiderror(Strings,Throwablee); voiderror(......
  • el-tree 组件自定义样式 最后一级flex,其余级别正常block
    先上需求的效果图el-tree的样式一般全都是block换行的,如下图先分析一下,1.树结构的级别是不确定的,但是样式上要求最后一个层级需要横着排列,其余竖着排,超出需要换行2.如何找到每一个数据项的最后一级呢?3.找到之后怎么办?ok,then,1.先通过插槽吧,因为这样咱们可以自定义最后一......
  • 使用 Nuxt 3 的 defineRouteRules 进行页面级别的混合渲染
    title:使用Nuxt3的defineRouteRules进行页面级别的混合渲染date:2024/8/12updated:2024/8/12author:cmdragonexcerpt:摘要:本文介绍了Nuxt3中的defineRouteRules功能,用于实现页面级别的混合渲染配置。通过启用实验性选项inlineRouteRules,开发者能够在nuxt.config......
  • 4.3.3 OpenCV 实现 高斯金字塔和拉普拉斯金字塔
    4.3.3OpenCV实现高斯金字塔和拉普拉斯金字塔参考教程:图像处理中的高斯金字塔和拉普拉斯金字塔_拉普拉斯金字塔插入偶数行,偶数列也是用卷积算法吗-CSDN博客1.安装OpenCV1.1下载OpenCV参考教程:无法定位软件包libjasper-dev的解决办法-CSDN博客视觉slam14讲ch5opencv......
  • 不能在此路径中使用此配置节,如果在父级别上锁定了该节,便会出现这种情况的解决办法
    原文链接:https://www.pageadmin.net/help/96.cshtml问题描述:打开网站一直提示“不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny")”具体如下图:问题分析:出现这个错误是因为IIS7采用了更安全的web.con......
  • 不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认
    原文链接:https://www.cnblogs.com/wwssgg/p/17984105今天运行项目的时候出现了这个错误....查了一下解决的方法。 具体方案如下: 1、先确认安装IIS的时候有没有装Asp.Net,如果没安装的话,安装上即可。(XTHS:采用这步,就可以了!) 2、IIS采用了更安全的web.config管理机制,默......
  • DriverManager.getConnection的底层如何实现(非机器级别)
    前言DriverManager.getConnection的目标是获得一个Connection,而Connection的关键部分在于QueryExecutor顺序DriverManager的getConnection的实现方法,实际上是对其存储的每个"Driver"(实际并非直接存储Driver类型引用)尝试执行Driver.connect(url,info);Driver.connect(url,info)......
  • RAZ分级阅读英语绘本pdf电子版免费下载全部目录对应年龄级别
    英语绘本电子版免费下载:  RAZ分级阅读绘本全部目录对应年龄级别: 《RAZ》分级阅读特色 特色一:绘本数量多29个级别,每个级别百本左右图书,整个体系囊括近2800多本图书。其中RAZA和B两个级别的图书数量,就已经相当于一些分级阅读的总数量,多年积累的分级阅读绘本数量......
  • 【YashanDB数据库】statement级别的触发器在jdbc接口调用executeBatch时被多次触发
    问题现象某客户使用jdbc接口向yashandb的表A插入数据。表A上有一个语句级触发器,其内容为在触发时执行altersequence操作;另外还有一个insert时的行级触发器,其内容为将每行的部分列赋给新值,这些新值要么来自sequence.nextval,要么来自于current_timestamp。客户向表A插入90万条数......