HSmartWindowControl的ROI创建
在上一篇文章中提到过使用Halcon的HSmartWindowControl的控件虽然可以给我们带来图形缩放和拖动方面的便利,但是它无法再直接通过之前的DrawRectangle1等函数来绘制ROI区域。对于这部分的ROI图形可以通过HDrawingObject来建立,下面将通过一个例子来讲解这块的操作过程。
- 建立HDrawingObject对象
HDrawingObject drawingObject = new HDrawingObject();
- 以Rectangle1为例,创建相应的形状
drawingObject = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1,height/ 4, width /4,height* 0.75,width *0.75);
其中width、height为图形的宽和高,本例创建一个位于图像中心的且1/4图像尺寸的矩形图形。
- 将创建的图形关联至HSmartWindowControl窗口
hswControl.HalconWindow.AttachDrawingObjectToWindow(drawingObject);
其中hswControl是相应的控件窗口名称,完成上述步骤后正常应该能够看到相应的矩形框显示在图像控件中,可以调整矩形框的位置和大小
- 调整好ROI的位置区域后,获得图形参数做你想做的事例如模板学习、找边等。
HTuple paramName ;
string[] paramlist = { "row1", "column1", "row2", "column2" };
paramName =paramlist;
HTuple param = drawingObject.GetDrawingObjectParams(paramName);
- 本例以项目中经常使用的模板学习为例来演示,首先调整矩形框至需要学习的模板区域,然后执行如下代码:
HRegion rectangle1 = new HRegion();
rectangle1.GenRectangle1(param.DArr[0], param.DArr[1], param.DArr[2], param.DArr[3]);
HImage reducedImg = image.ReduceDomain(rectangle1);
reducedImg.WriteImage("png", 0, "E:\\test.png");
drawingObject.ClearDrawingObject();
正常情况下在相应文件位置应该能看到相应的图片。
以下是WPF程序的相应前后台代码
前台
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPFHalconSmartBasic"
xmlns:HalconDotNet="clr-namespace:HalconDotNet;assembly=halcondotnet" x:Class="WPFHalconSmartBasic.MainWindow"
mc:Ignorable="d"
Title="HalconSmartWindow" Height="450" Width="741.829">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="169*"/>
<ColumnDefinition Width="76*"/>
</Grid.ColumnDefinitions>
<HalconDotNet:HSmartWindowControlWPF Name="hswControl" HDoubleClickToFitContent="True" HMoveContent="False" HZoomContent="Off" Grid.Column="0" Grid.Row="0" Margin="2" Loaded="HswControl_Loaded" />
<Button Name="btnCreateRectRoi" Content="CreateRectangle" Grid.Column="1" HorizontalAlignment="Left" Margin="51.8,35,0,0" VerticalAlignment="Top" Width="124" Height="30" Click="BtnCreateRectRoi_Click"/>
<Button Name="btnPatLearn" Content="PatLearn" Grid.Column="1" HorizontalAlignment="Left" Margin="51.8,105,0,0" VerticalAlignment="Top" Width="124" Height="30" Click="BtnPatLearn_Click"/>
</Grid>
</Window>
后台代码
public partial class MainWindow : Window
{
int width = 0;
int height = 0;
HDrawingObject drawingObject = new HDrawingObject();
HImage image = new HImage();
public MainWindow()
{
InitializeComponent();
}
private void HswControl_Loaded(object sender, RoutedEventArgs e)
{
image.ReadImage("E:\\2.bmp");
hswControl.HalconWindow.DispImage(image);
}
private void BtnCreateRectRoi_Click(object sender, RoutedEventArgs e)
{
image.GetImageSize(out width, out height);
drawingObject = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, height / 4, width / 4, height * 0.75, width * 0.75);
hswControl.HalconWindow.AttachDrawingObjectToWindow(drawingObject);//将图像关联到Halcon窗口控件
}
private void BtnPatLearn_Click(object sender, RoutedEventArgs e)
{
HTuple paramName ;
string[] paramlist = { "row1", "column1", "row2", "column2" };
paramName = paramlist;
HTuple param = drawingObject.GetDrawingObjectParams(paramName);
HRegion rectangle1 = new HRegion();
rectangle1.GenRectangle1(param.DArr[0], param.DArr[1], param.DArr[2], param.DArr[3]);
HImage reducedImg = image.ReduceDomain(rectangle1);
reducedImg.WriteImage("png", 0, "E:\\test.png");
drawingObject.ClearDrawingObject();
}
}