Halcon 简单图像拼接

1. 简单图像拼接

简单图像的拼接,不涉及图像融合,仅简单地平移将多张图拼接成一张图。
明确问题:

  1. 将多少张图拼起来?由于是多张图,这需要一个元组来存储多张图片的集合。
  2. 是横向拼图,还是纵向拼图?这涉及拼图的方向。
  3. 是一张挨着一张无缝拼接吗?能不能做“有缝”的自由拼接?这涉及拼接偏移量。

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(输出控制):可选项,返回拼接后大图像的宽度和高度。

例子:

// 假设有两张图像: image1 和 image2
HObject image1,image2;
HObject hoTiledImage;

// 制作图像元组
GenEmptyObj(&hoTiledImage);
ConcatObj(hoTiledImage, image1, &hoTiledImage);
ConcatObj(hoTiledImage, image2, &hoTiledImage);

// 设置偏移量:
// image1 放置在 (0, 0)
// image2 放置在 image1 右侧,距离50像素,以每张图像的左上角点作为起始点
HTuple hv_OffsetRow = {0, 0};      // 行偏移
HTuple hv_OffsetCol = {0, 50};      // 列偏移

// 不指定输出尺寸,由算子自动计算
HTuple hv_Width, hv_Height;
hv_Width = HTuple();
hv_Height = HTuple();

// 执行拼接
HTuple hv_Row1, hv_Col1, hv_Row2, hv_Col2;
HalconCpp::TileImagesOffset(hv_Images, &hoTiledImage, 
    hv_OffsetRow,  hv_OffsetCol, 
    &hv_Row1, &hv_Col1, &hv_Row2, &hv_Col2, 
    &hv_Width, &hv_Height
);
posted @ 2025-09-03 14:01  一楼二栋  阅读(191)  评论(0)    收藏  举报