基于Halcon学习的一维码识别【二十七】grid_rectification.hdev

本例说明了如何使用运算符进行网格校正。下面的命令创建一个postscript文件,它包含了修正网格。这个网格一定是印刷品。然后必须将其安装在物体表面


总代码:

WidthOfGrid := 0.17
NumSquares := 17
*生成描述校正网格的PostScript文件。
create_rectification_grid (WidthOfGrid, NumSquares, 'rectification_grid.ps')
* 
* Read the image of the object wrapped by the rectification grid
* and reopen the window with an appropriate size.
*读取由校正网格包裹的对象的图像,并以适当的大小重新打开窗口。

*读取图片
read_image (Image, 'can_with_grid')
get_image_size (Image, ImageWidth, ImageHeight)
dev_close_window ()

*打开窗口
dev_open_window (0, 0, ImageWidth * 0.75, ImageHeight * 0.75, 'black', WindowID1)
dev_display (Image)
dev_update_off ()
set_display_font (WindowID1, 14, 'mono', 'true', 'false')
* 
* 
* Part 1: Determination of the image map
* The surface to be rectified is wrapped by a checkered pattern, which
* is used to determine the mapping between the distorted image and
* the rectified image. Note the orientation of the two circular marks. When
* in gen_grid_rectification_map() the parameter Rotation is 'auto', the rectified
* image is rotated such that the black mark is left of the white mark.

*第1部分:图像地图的确定
*要矫正的表面被棋盘格图案包裹,这用于确定扭曲图像和图像之间的映射校正后的图像。
*注意两个圆形标记的方向。什么时候在gen_grid_Convertification_map()中,
*参数旋转为“自动”,校正后的旋转图像,使黑色标记位于白色标记的左侧。

* Determine region of interest
*确定感兴趣的区域
MinContrast := 25
Radius := 10
*分割图像中的校正网格区域。
*查找校正网格在图像中搜索包含校正网格的图像部分,并将其返回到区域网格区域
find_rectification_grid (Image, GridRegion, MinContrast, Radius)
* 
dev_display (GridRegion)
*显示信息--网格区域
disp_message (WindowID1, 'Grid region', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowID1, 'black', 'true')
stop ()
*抠图
reduce_domain (Image, GridRegion, ImageReduced)
* 
* Determine grid points
*确定网格点
SigmaSaddlePoints := 1.5
Threshold := 5
*图像中鞍点的亚像素精确检测。
*鞍点_sub_pix以亚像素精度从图像中提取鞍点,
*即沿一个方向图像强度最小,同时沿另一个方向图像强度最大的点。
saddle_points_sub_pix (ImageReduced, 'facet', SigmaSaddlePoints, Threshold, Row, Col)
* 
dev_set_color ('blue')
*为每个输入点生成一个十字形状的xld轮廓。
gen_cross_contour_xld (SaddlePoints, Row, Col, 6, 0.785398)
dev_display (Image)
dev_display (SaddlePoints)
disp_message (WindowID1, 'Grid points', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowID1, 'black', 'true')
stop ()
* 
* Connect points to grid
*将点连接到网格
SigmaConnectGridPoints := 0.9

MaxDist := 5.0

GridSpacing := 20
dev_set_color ('red')
*在整流网格的网格点之间建立连接。
connect_grid_points (ImageReduced, ConnectingLines, Row, Col, SigmaConnectGridPoints, MaxDist)
* 
dev_display (ConnectingLines)
*显示信息--连通网格点
disp_message (WindowID1, 'Connected grid points', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowID1, 'black', 'true')
stop ()
* 
* Determine image map
*确定图像映射
*根据规则网格的点计算畸变图像和校正图像之间的映射。
gen_grid_rectification_map (ImageReduced, ConnectingLines, Map, Meshes, GridSpacing, 0, Row, Col, 'bilinear')
*对图像应用常规变换。
map_image (ImageReduced, Map, ImageMapped)
* 
get_image_size (Map, MapWidth, MapHeight)
dev_open_window (0, (ImageWidth * 0.75) + 12, MapWidth, MapHeight, 'black', WindowID2)
set_display_font (WindowID2, 14, 'mono', 'true', 'false')
dev_display (ImageMapped)
*显示信息--整流电网
disp_message (WindowID2, 'Rectified grid', 'window', 12, 12, 'black', 'true')
stop ()
* 
* 
* Part 2: Application of the image map
* The original surface (without the checkered pattern) is rectified
* using the previously calculated image map.
*第二部分:影像地图的应用
*原始曲面(无棋盘格图案)已被校正
*使用之前计算的图像贴图。

* Read in the image to be rectified
*读入要校正的图像
read_image (Image, 'can')
* 
* Rectify image using the previously calculated image map
*使用之前计算的图像贴图校正图像
dev_set_window (WindowID2)
*对图像应用常规变换。
map_image (Image, Map, ImageMapped)
* 
dev_set_window (WindowID1)
dev_display (Image)
disp_message (WindowID1, 'Original image', 'window', 12, 12, 'black', 'true')
dev_set_window (WindowID2)
dev_display (ImageMapped)
disp_message (WindowID2, 'Rectified image', 'window', 12, 12, 'black', 'true')

逐段分析:

*定义一些变量
WidthOfGrid := 0.17
NumSquares := 17

*生成描述校正网格的PostScript文件。
create_rectification_grid (WidthOfGrid, NumSquares, 'rectification_grid.ps')

*读取由校正网格包裹的对象的图像,并以适当的大小重新打开窗口。

*读取图片
read_image (Image, 'can_with_grid')
get_image_size (Image, ImageWidth, ImageHeight)
dev_close_window ()

*打开窗口
dev_open_window (0, 0, ImageWidth * 0.75, ImageHeight * 0.75, 'black', WindowID1)
dev_display (Image)
dev_update_off ()
set_display_font (WindowID1, 14, 'mono', 'true', 'false')

*确定感兴趣的区域
MinContrast := 25
Radius := 10

*分割图像中的校正网格区域。
*查找校正网格在图像中搜索包含校正网格的图像部分,并将其返回到区域网格区域
find_rectification_grid (Image, GridRegion, MinContrast, Radius)
dev_display (GridRegion)

*显示信息--网格区域
disp_message (WindowID1, 'Grid region', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowID1, 'black', 'true')
stop ()

*抠图
reduce_domain (Image, GridRegion, ImageReduced)

*确定网格点
SigmaSaddlePoints := 1.5
Threshold := 5

*图像中鞍点的亚像素精确检测。
*鞍点_sub_pix以亚像素精度从图像中提取鞍点,
*即沿一个方向图像强度最小,同时沿另一个方向图像强度最大的点。
saddle_points_sub_pix (ImageReduced, 'facet', SigmaSaddlePoints, Threshold, Row, Col)
dev_set_color ('blue')

*为每个输入点生成一个十字形状的xld轮廓。
gen_cross_contour_xld (SaddlePoints, Row, Col, 6, 0.785398)

*显示图像
dev_display (Image)

*显示网格点
dev_display (SaddlePoints)

*显示信息'Grid points'--网格点
disp_message (WindowID1, 'Grid points', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowID1, 'black', 'true')
stop ()

*将点连接到网格
SigmaConnectGridPoints := 0.9
MaxDist := 5.0
GridSpacing := 20

*设置颜色为红色
dev_set_color ('red')

*在整流网格的网格点之间建立连接。
connect_grid_points (ImageReduced, ConnectingLines, Row, Col, SigmaConnectGridPoints, MaxDist)

*显示连接线
dev_display (ConnectingLines)

*显示信息--连通网格点
disp_message (WindowID1, 'Connected grid points', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowID1, 'black', 'true')
stop ()

*确定图像映射
*根据规则网格的点计算畸变图像和校正图像之间的映射。
gen_grid_rectification_map (ImageReduced, ConnectingLines, Map, Meshes, GridSpacing, 0, Row, Col, 'bilinear')

*对图像应用常规变换。
map_image (ImageReduced, Map, ImageMapped)

*得到Map的宽高
get_image_size (Map, MapWidth, MapHeight)

*打开一个新的窗口
dev_open_window (0, (ImageWidth * 0.75) + 12, MapWidth, MapHeight, 'black', WindowID2)
set_display_font (WindowID2, 14, 'mono', 'true', 'false')
dev_display (ImageMapped)

*显示信息--整流电网
disp_message (WindowID2, 'Rectified grid', 'window', 12, 12, 'black', 'true')
stop ()

*读入要校正的图像
read_image (Image, 'can')

*使用之前计算的图像贴图校正图像
dev_set_window (WindowID2)

*对图像应用常规变换。
map_image (Image, Map, ImageMapped)

*设置活动窗口
dev_set_window (WindowID1)
dev_display (Image)

*显示信息--原始图像
disp_message (WindowID1, 'Original image', 'window', 12, 12, 'black', 'true')

*设置活动窗口
dev_set_window (WindowID2)
dev_display (ImageMapped)

*显示信息--校正图像
disp_message (WindowID2, 'Rectified image', 'window', 12, 12, 'black', 'true')


 主要算子解释:

create_rectification_grid( : : Width, NumSquares, GridFile : )

功能:生成描述校正网格的PostScript文件

Width:方格图案的宽度,以米为单位(不含两帧)

NumSquares:每行和每列的方块数

GridFile :PostScript文件的文件名

find_rectification_grid(Image : GridRegion : MinContrast, Radius : )

功能:分割图像中的校正网格区域。查找校正网格在图像中搜索包含校正网格的图像部分,并将其返回到区域网格区域。为此提取对比度至少为MinContrast的基本图像区域,并填充这些区域中的孔。

GridRegion:包含校正网格的输出区域

MinContrast:最小对比度

Radius:圆形结构元素的半径

saddle_points_sub_pix(Image : : Filter, Sigma, Threshold : Row, Column)

功能:图像中鞍点的亚像素精确检测。以亚像素精度从图像中提取鞍点,即沿一个方向图像强度最小,同时沿另一个方向图像强度最大的点

Filter:过滤器,偏导数的计算方法

Sigma:高斯函数的西格玛。如果过滤器为“面”,则Sigma可能为0.0,以避免输入图像的平滑

Threshold:Hessian矩阵特征值的最小绝对值

Row:检测到的鞍点的行坐标

Column:检测到的鞍点的列坐标

gen_cross_contour_xld( : Cross : Row, Col, Size, Angle : ) 

功能:为每个输入点生成一个十字形状的xld轮廓。轮廓由两条长度大小的线组成,它们在输入点上正好相交。它们的方位是由角度决定的。十字架以十字架的形式返回。如果有多个点需要处理,它们的坐标必须作为元组传递。

Cross:生成XLD轮廓

Row:输入点的行坐标

Col:输入点的列坐标

Size:横杆的长度

Angle:十字架的方向

connect_grid_points(Image : ConnectingLines : Row, Column, Sigma, MaxDist : ) 

功能:在整流电网的电网点之间建立连接。连接网格点搜索网格点(行、列)之间的连接线。连接线是通过边缘检测器、平滑滤波器和线检测器的组合从输入图像中提取的,每种检测器的大小不同。

ConnectingLines:输出轮廓。

Row:网格点的行坐标。

Column:网格点的列坐标。

Sigma:应用高斯的大小。

MaxDist :连接线与网格点的最大距离。

gen_grid_rectification_map(Image, ConnectingLines : Map, Meshes : GridSpacing, Rotation, Row, Column, MapType : )

功能:根据规则网格的点计算畸变图像和校正图像之间的映射。计算扭曲图像中实际检测到的网格点(行、列)与理想规则点网格的对应网格点之间的映射

ConnectingLines:输入轮廓

Map:包含映射数据的图像

Meshes:输出轮廓

GridSpacing:校正图像中网格点的距离

Rotation:要应用于点栅格的旋转

Row:网格点的行坐标

Column:网格点的列坐标

MapType:映射类型

map_image(Image, Map : ImageMapped : : )

功能:对图像应用常规变换。使用任意变换贴图变换图像

Image:要映射的图像

Map:包含映射数据的图像

ImageMapped:映射图像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值