前言:
dev_set_part / set_part 其实功能是一样的。下面就set_part 进行讲解。
背景
我在写程序的时候需要一个诉求,我找了很多瑕疵,每个瑕疵都有一个位置,这些位置在一个数据的列表,我希望在列表点到瑕疵位置的时候,能将该瑕疵显示到显示窗口的中间!
最开始,我想到的是仿射变换,但是最后,我发现set_part, 在这里使用才是最合适的!
效果如下图所示:(小黑块就是窗口的中间)
set_part 参数
set_part 作用为修改窗口中显示的图像部分。
(Row1,Culumn1 第1列)表示显示的图像部分的左上角,
(Row2,Culumn2 第2列)表示右下角
set_part 理解
set_part 就是设置窗口显示图片的那个部分的区域,显示窗口的大小是固定的。如果,我将左上角,设置为(0,0)也就是窗口的左上角坐标。右下角设置为图片的宽高。意思就是显示的图片的全部内容。
那么图片就会按照窗口的大小进行适配,显示整张图片:
这里我用图片四分之一的窗口显示了整张图片。注意,set_part会自动考虑窗口的大小。
图片的移到
回到正题,我们如何通过它实现图一中移动的效果:
/// <summary>
/// 将某个目标位置移动到中间
/// </summary>
public void MoveSm2Center(HObject img, HTuple w, HTuple h)
{
HTuple imgw;
HTuple imgh;
HOperatorSet.GetImageSize(img, out imgw, out imgh);
HTuple offset_w = imgw/2;
HTuple offset_h = imgh/2;
hSmart.HalconWindow.SetPart(w- offset_w, h- offset_h, w + offset_w, h + offset_h);
}
首先,set_part会自动考虑窗口的大小,所以:
(Row1,Culumn1 第1列)处的图片 会显示在窗口的左上角,
(Row2,Culumn2 第2列)处的图片 会显示在窗口的右下角。
w,h是目标点,我想将其显示到中间,SetPart(w,h
那么 w,h 会显示到左上角,那如果要显示到中间,那么左上角应该显示图片以外的部分,其实就是个负数了,这样就实现了偏移。
所以,这里我左上角减去了,图片的一半的尺寸,而右下角加上了图片的一般尺寸。这样显示的范围仍然是一张图的范围。只不过目标点移到了中间位置!
HTuple offset_w = imgw/2;
HTuple offset_h = imgh/2;
图片的放大
如果把上面的除以2,改成除以 20会发生上面?在窗口不变的情况下,只显示图片的十分之一了。这其实就是把图片放大了。