Halcon 简单图像拼接

礼包大厅

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

例子:

// 假设有两张图像: 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

);

Copyright © 2088 今日游戏江湖 - 全品类网游活动聚合 All Rights Reserved.
友情链接