此方法旨在满足部分区域拍照后,想输出成一张图,对重叠区域要求不是很高。区别于图像拼接方法,请注意。
勇哥2019/5注:下面的办法只适合拼合灰度图片,如果你想拼合彩色图片则要用另外的办法。
在这里,我在一个文件夹中保存了9张图,遍历读取,从而合成显示。

图片合成方法
public void ImageJigsaw(string path = "C:/Users/team/Desktop/4/")
{
HObject ho_Rectangle;
HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
HTuple hv_Rows = new HTuple(), hv_Cols = new HTuple();
HOperatorSet.GenEmptyObj(out ho_Rectangle);
HOperatorSet.ReadImage(out h_Image, path + 1 + ".bmp");
hv_Width.Dispose();
hv_Height.Dispose();
HOperatorSet.GetImageSize(h_Image, out hv_Width, out hv_Height);
//生成一个3倍大小的空白图像
h_ImageJig.Dispose();
HOperatorSet.GenImageConst(out h_ImageJig, "byte", hv_Width * 3, hv_Height * 3);
//生成图像全部区域
ho_Rectangle.Dispose();
HOperatorSet.GenRectangle1(out ho_Rectangle, 0, 0, hv_Height - 1, hv_Width - 1);
//从区域生成所有的像素坐标
hv_Rows.Dispose();
hv_Cols.Dispose();
HOperatorSet.GetRegionPoints(ho_Rectangle, out hv_Rows, out hv_Cols);
for (int i = 1; i < 10; i++)
{
HObject ho_Image;
HTuple Rows = hv_Rows;
HTuple Cols = hv_Cols;
HTuple Width=new HTuple();
HTuple Height=new HTuple();
HTuple hv_Grayvals = new HTuple();
HOperatorSet.GenEmptyObj(out ho_Image);
//读取图像
ho_Image.Dispose();
HOperatorSet.ReadImage(out ho_Image, path + i + ".bmp");
HOperatorSet.Rgb1ToGray(ho_Image, out ho_Image);
//灰度值转化
HOperatorSet.GetImageSize(ho_Image,out Width,out Height);
HOperatorSet.SetPart(h_hWindowHandle,0,0,Height-1,Width-1);
HOperatorSet.DispObj(ho_Image, h_hWindowHandle);
//读取图像的全部像素
hv_Grayvals.Dispose();
HOperatorSet.GetGrayval(ho_Image, Rows, Cols, out hv_Grayvals);
switch (i)
{
//将所有像素坐标加上偏移量
case 1:
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Rows = Rows;
Rows.Dispose();
Rows = ExpTmpLocalVar_Rows;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Cols = Cols;
Cols.Dispose();
Cols = ExpTmpLocalVar_Cols;
}
}
break;
case 2:
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Rows = Rows;
Rows.Dispose();
Rows = ExpTmpLocalVar_Rows;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Cols = Cols + (hv_Width);
Cols.Dispose();
Cols = ExpTmpLocalVar_Cols;
}
}
break;
case 3:
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Rows = Rows;
Rows.Dispose();
Rows = ExpTmpLocalVar_Rows;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Cols = Cols + (hv_Width * 2);
Cols.Dispose();
Cols = ExpTmpLocalVar_Cols;
}
}
break;
case 4:
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Rows = Rows + (hv_Height);
Rows.Dispose();
Rows = ExpTmpLocalVar_Rows;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Cols = Cols + (hv_Width * 2);
Cols.Dispose();
Cols = ExpTmpLocalVar_Cols;
}
}
break;
case 5:
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Rows = Rows + (hv_Height);
Rows.Dispose();
Rows = ExpTmpLocalVar_Rows;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Cols = Cols + (hv_Width);
Cols.Dispose();
Cols = ExpTmpLocalVar_Cols;
}
}
break;
case 6:
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Rows = Rows + (hv_Height);
Rows.Dispose();
Rows = ExpTmpLocalVar_Rows;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Cols = Cols;
Cols.Dispose();
Cols = ExpTmpLocalVar_Cols;
}
}
break;
case 7:
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Rows = Rows + (hv_Height * 2);
Rows.Dispose();
Rows = ExpTmpLocalVar_Rows;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Cols = Cols;
Cols.Dispose();
Cols = ExpTmpLocalVar_Cols;
}
}
break;
case 8:
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Rows = Rows + (hv_Height * 2);
Rows.Dispose();
Rows = ExpTmpLocalVar_Rows;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Cols = Cols + (hv_Width);
Cols.Dispose();
Cols = ExpTmpLocalVar_Cols;
}
}
break;
case 9:
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Rows = Rows + (hv_Height * 2);
Rows.Dispose();
Rows = ExpTmpLocalVar_Rows;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_Cols = Cols + (hv_Width * 2);
Cols.Dispose();
Cols = ExpTmpLocalVar_Cols;
}
}
break;
}
//将图像的所有像素覆盖到空白图像的指定区域
HOperatorSet.SetGrayval(h_ImageJig, Rows, Cols, hv_Grayvals);
hv_Grayvals.Dispose();
ho_Image.Dispose();
Rows.Dispose();
Cols.Dispose();
}
hv_Width.Dispose();
hv_Height.Dispose();
HOperatorSet.GetImageSize(h_ImageJig, out hv_Width, out hv_Height);
HOperatorSet.SetPart(h_hWindowHandle, 0, 0, hv_Height, hv_Width);
HOperatorSet.DispObj(h_ImageJig, h_hWindowHandle);
hv_Rows.Dispose();
hv_Cols.Dispose();
ho_Rectangle.Dispose();
h_ImageJig.Dispose();
}Form调用显示效果

你要的Halcon源码
* 读图 ImageFiles := [] ImageFiles[0] := 'I:/Data_Nick/素材/4/1.bmp' ImageFiles[1] := 'I:/Data_Nick/素材/4/2.bmp' ImageFiles[2] := 'I:/Data_Nick/素材/4/3.bmp' ImageFiles[3] := 'I:/Data_Nick/素材/4/4.bmp' ImageFiles[4] := 'I:/Data_Nick/素材/4/5.bmp' ImageFiles[5] := 'I:/Data_Nick/素材/4/6.bmp' ImageFiles[6] := 'I:/Data_Nick/素材/4/7.bmp' ImageFiles[7] := 'I:/Data_Nick/素材/4/8.bmp' ImageFiles[8] := 'I:/Data_Nick/素材/4/9.bmp' *根据图片大小创建空白图像 read_image (Image, ImageFiles[0]) get_image_size (Image, Width, Height) gen_image_const (ImageJig, 'byte', Width*3, Height*3) *获得单个图片的所有像素坐标 gen_rectangle1 (Rectangle, 0, 0, Height-1, Width-1) get_region_points (Rectangle, Rows, Columns) *对每张图片操作 for Index := 0 to |ImageFiles| - 1 by 1 RowsT:=0 ColsT:=0 read_image (Image, ImageFiles[Index]) *转灰 rgb1_to_gray (Image, GrayImage) *根据像素点读取全部像素 get_grayval (GrayImage, Rows, Columns, Grayval) *加偏移量,将所有像素点存入对应位置 switch (Index) case 0: RowsT:=Rows ColsT:=Columns break case 1: RowsT:=Rows ColsT:=Columns+Width break case 2: RowsT:=Rows ColsT:=Columns+Width*2 break case 3: RowsT:=Rows+Height ColsT:=Columns+Width*2 break case 4: RowsT:=Rows+Height ColsT:=Columns+Width break case 5: RowsT:=Rows+Height ColsT:=Columns break case 6: RowsT:=Rows+Height*2 ColsT:=Columns break case 7: RowsT:=Rows+Height*2 ColsT:=Columns+Width break case 8: RowsT:=Rows+Height*2 ColsT:=Columns+Width*2 break endswitch *填入像素 set_grayval (ImageJig, RowsT, ColsT, Grayval) endfor *显示合成图像 dev_display (ImageJig)
Halcon界面
