关于Halcon基于特征点图像拼接的算子实现

dev_update_off ()
read_image (Image1, ‘C:/Users/HS/Desktop/test/building_01.png’)
rgb3_to_gray (Image1, Image1, Image1, ImageGray)
read_image (Image2, ‘C:/Users/HS/Desktop/test/building_02.png’)
rgb3_to_gray (Image2, Image2, Image2, ImageGray1)

get_image_size (ImageGray, Width, Height)
dev_open_window (0, 0, Width, Height, ‘white’, WindowHandle)

*获取两张图的特征点,可以使用获取交叉点的方式将所有点显示出来,这里不显示
points_foerstner (ImageGray, 1, 2, 3, 100, 0.3, ‘gauss’, ‘true’, Rows1, Columns1, CoRRJunctions, CoRCJunctions, CoCCJunctions, RowArea, ColumnArea, CoRRArea, CoRCArea, CoCCArea)
points_foerstner (ImageGray1, 1, 2, 3, 100, 0.3, ‘gauss’, ‘true’, Rows2, Columns2, CoRRJunctions, CoRCJunctions, CoCCJunctions, RowArea, ColumnArea, CoRRArea, CoRCArea, CoCCArea)

*匹配要拼接的两图边缘部分,可以设置匹配分数,旋转角度。即找到可以拼接的地方
*得到投影矩阵HomMat2DUnrectified,还有两边图像边缘部分匹对到的像素索引 Points1Unrectified, Points2Unrectified,可以显示出来。
proj_match_points_ransac (ImageGray, ImageGray1, Rows1, Columns1, Rows2, Columns2, ‘ncc’, 10, 0, 0, Height, Width, 0, 0.5, ‘gold_standard’, 2, 42, HomMat2DUnrectified, Points1Unrectified, Points2Unrectified)

*串接两个图标元组,ImageGray, ImageGray1传入的是引用类型,因此要避免原图被修改。连接功能区别于union1算子(region)
*输出Images元组包含了两个输入元组的所有图标对象
concat_obj (ImageGray, ImageGray1, Images)

*将串接的所有图像,在指定的第一张图上(索引的方式)按照顺序堆叠(镶嵌)起来(使用索引的方式)
*输出合成图像和图像的投影矩阵(镶嵌边缘):MosaicMatrices2DUnrectified
gen_projective_mosaic (Images, MosaicImageUnrectified, 1, 1, 2, HomMat2DUnrectified, ‘default’, ‘false’, MosaicMatrices2DUnrectified)
*以上拼接完成

get_image_size (MosaicImageUnrectified, Width1, Height1)

*输入投影矩阵和发生的投影区间(由最上到最下,既是两边图像的所有行都发生投影了所以行的区间是所有行[0,493],因为列方向没有投影,就设为0)
*得到投影后的坐标区间 :RowTrans, ColumnTrans
projective_trans_pixel (MosaicMatrices2DUnrectified[9:17], [0,493], [0,0], RowTrans, ColumnTrans)

*将多边形坐标生成XLD轮廓,显示出投影的边缘Contour,用于查看拼接边缘
gen_contour_polygon_xld (Contour, RowTrans, ColumnTrans)
set_line_style (WindowHandle, [1,5])

get_image_size (ImageGray, Width, Height)

*因为上述的拼接后可能存在连接处出现偏移(错位),proj_match_points_distortion_ransac算子再次匹配并计算出两边匹配后的径向畸变,输入从参数类似上面的proj_match_points_ransac算子,可调匹配分数,旋转。
*输出投影矩阵HomMat2D,径向畸变系数:Kappa,匹配均方差Error,两边匹配到的像素索引Points1, Points2。注意确保拼接的两图像尺寸一致!!!
proj_match_points_distortion_ransac (ImageGray, ImageGray1, Rows1, Columns1, Rows2, Columns2, ‘ncc’, 10, 0, 0, Height, Width, 0, 0.7, ‘gold_standard’, 1, 0, HomMat2D, Kappa, Error, Points1, Points2)

CamParDist := [0.0,Kappa,1.0,1.0,0.5 * (Width - 1),0.5 * (Height - 1),Width,Height]

*根据上述得到的径向畸变系数调整相机的内部参数,“fixed”表示只修改失真系数,其他内部摄像机参数保持不变,,期望的径向畸变是0。
change_radial_distortion_cam_par (‘fixed’, CamParDist, 0, CamPar)

*更改图像的径向变形,输入图像和要调整的区域,这里使用全图。输入改变图像径向失真的相机内部参数CamParDist和CamPar,将得到:修改径向变形后的图像:Image1Rect。
change_radial_distortion_image (ImageGray, ImageGray, Image1Rect, CamParDist, CamPar)
change_radial_distortion_image (ImageGray1, ImageGray1, Image2Rect, CamParDist, CamPar)

*重新拼接矫正畸变后的两张图像,同上拼接。
concat_obj (Image1Rect, Image2Rect, ImagesRect)
gen_projective_mosaic (ImagesRect, MosaicImage, 1, 1, 2, HomMat2D, ‘default’, ‘false’, MosaicMatrices2D)
get_image_size (MosaicImage, Width, Height)
dev_set_window_extents (-1, -1, Width, Height)
dev_clear_window ()
***完成

根据提供的引用内容,我了解到图像拼接在实际应用场景中非常广泛,而图像配准是整个图像拼接的核心。下面是Halcon中的图像拼接算子: 1. `mosaic_image`算子:该算子可以将多个图像拼接成一个大的全景图像。该算子需要输入待拼接的图像和它们之间的变换矩阵,输出拼接后的全景图像。 示例代码如下: ```Halcon mosaic_image(ImageList, HomMat3DList, MosaicImage) ``` 其中,`ImageList`是待拼接的图像列表,`HomMat3DList`是每个图像之间的变换矩阵列表,`MosaicImage`是拼接后的全景图像。 2. `gen_mosaic_image_param`算子:该算子可以生成用于拼接图像的参数。该算子需要输入待拼接的图像和它们之间的变换矩阵,输出用于拼接图像的参数。 示例代码如下: ```Halcon gen_mosaic_image_param(ImageList, HomMat3DList, 'default', MosaicParam) ``` 其中,`ImageList`是待拼接的图像列表,`HomMat3DList`是每个图像之间的变换矩阵列表,`'default'`表示使用默认参数,`MosaicParam`是用于拼接图像的参数。 3. `mosaic_images`算子:该算子可以将多个图像拼接成一个大的全景图像。该算子需要输入待拼接的图像和它们之间的变换矩阵,输出拼接后的全景图像。 示例代码如下: ```Halcon mosaic_images(ImageList, HomMat2DList, 'average', MosaicImage) ``` 其中,`ImageList`是待拼接的图像列表,`HomMat2DList`是每个图像之间的变换矩阵列表,`'average'`表示使用平均值法拼接图像,`MosaicImage`是拼接后的全景图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值