Halcon图像拼接如何实现效果?

摘要:1. 简单图像拼接 简单图像的拼接,不涉及图像融合,仅简单地平移将多张图拼接成一张图。 明确问题: 将多少张图拼起来?由于是多张图,这需要一个元组来存储多张图片的集合。 是横向拼图,还是纵向拼图?这涉及拼图的方向。 是一张挨着一张无缝拼接吗
1. 简单图像拼接 简单图像的拼接,不涉及图像融合,仅简单地平移将多张图拼接成一张图。 明确问题: 将多少张图拼起来?由于是多张图,这需要一个元组来存储多张图片的集合。 是横向拼图,还是纵向拼图?这涉及拼图的方向。 是一张挨着一张无缝拼接吗?能不能做“有缝”的自由拼接?这涉及拼接偏移量。 tile_images 算子签名:tile_images(Images : TiledImage : NumColumns, TileOrder : ) 输入参数: Images(输入对象):多个待拼接的图像(单个图像组成的元组)。 输出参数: TiledImage(输出对象):拼接后的大图像 控制参数: NumColumns:指定在水平方向上排列的图像数量(即每行几个图像) TileOrder:图片排列的顺序 "horizontal"(水平顺序)或 "vertical"(垂直顺序) 注意: 输入图像的通道数必须相同,因此需要在前面增加通道数的判断。 输入图像的尺寸必须相同,因此需要在前面增加图像尺寸的判断。 // 检测图像通道数,结果图为三通道彩色,原图为单通道 HTuple channels1, channels2; HalconCpp::CountChannels(hoImage1Scaled, &channels1); HalconCpp::CountChannels(hoImage2Scaled, &channels2); if (channels1.I() == 1 && channels2.I() == 3) { HalconCpp::Compose3(hoImage1Scaled, hoImage1Scaled, hoImage1Scaled, &hoImage1Scaled); } else if (channels1.I() == 3 && channels2.I() == 1) { HalconCpp::Compose3(hoImage2Scaled, hoImage2Scaled, hoImage2Scaled, &hoImage2Scaled); } TileOrder参数决定了图像是按行优先(水平)还是列优先(垂直)排列 如果我们设置 TileOrder = "horizontal",那么图像会按行排列,即先从左到右排列,排满一行再排下一行(行优先)。 如果我们设置 TileOrder = "vertical",那么图像会按列排列,即先从上到下排列,排满一列再排下一列(列优先)。 例子: read_image (Image1, '01.jpg') read_image (Image2, '02.jpg') get_image_size (Image2, Width, Height) gen_empty_obj (imgs) concat_obj (imgs, Image1, imgs) concat_obj (imgs, Image2, imgs) tile_images (imgs, TiledImage, 3 , 'vertical') // 按列优先排列 tile_images_offset 算子签名:tile_images_offset(Images : TiledImage : OffsetRow, OffsetCol, Row1, Col1, Row2, Col2, Width, Height : ) 输入参数: Images(输入对象):多个待拼接的图像(单个图像组成的元组)。 输出参数: TiledImage(输出对象):拼接后的大图像。 控制参数: OffsetRow, OffsetCol:(输入控制):每个图像在大图中的偏移量(行、列方向)。这两个参数是多个偏移量组成的元组,其长度必须与输入图像数量一致。 Row1, Col1, Row2, Col2(输出控制):可选项,返回大图中每个图像的区域坐标(左上角Row1, Col1;右下角Row2, Col2)。 Width, Height(输出控制):可选项,返回拼接后大图像的宽度和高度。
阅读全文