Halcon:代码导出(C#)

本文记录了Halcom图像处理软件中DrawingObject实例包含的文件image_processing.hdev文件导出为C#的过程及相关说明。

1)image_processing.hdev源代码:

* Initialize visualization:设置窗体信息
dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_set_part (0, 0, 511, 511)
* 
* Read background image and attach it to the window:读取图像文件fabrik并显示
read_image (Image, 'fabrik')
attach_background_to_window (Image, WindowHandle)
* 
* Add a drawing object and start the processing loop:包括子函数,画(100,100)-(200,200)的矩形框
add_new_drawing_object ('rectangle1', WindowHandle, DrawID)
*Sobel边沿算子对矩形框运算,得到图像EdgeAmplitude
process_image (Image, EdgeAmplitude, WindowHandle, DrawID)
display_results (EdgeAmplitude)    *图像重叠显示

红色字体部分包含子函数(非Halcon内置函数);

2)在HDevelop中运行代码,会看到:

 

这是显示原始图像;


双击图像变量EdgeAmplit,会看到在左上角(100,100)-(200,200)矩形框中的变化。

3)在HDeveloper中选择文件/导出(x)进入到以下界面:


界面中指定了导出代码格式(C#),导出范围等,我发现如果选择导出范围为“外部函数“的话,代码很长,而且不方便阅读;建议选择导出方式为“程序“,代码就好看多了。

4)以下为C#中所看到的的导出类hDevelopExport(为啥包含关键字partial不是很理解?):


从上面可以看出,第一步中的子函数(add_new_drawing_object, process_image,display_results)在这里都有对应的函数显示。

参数hv_ExpDefaultWinHandle表示显示图像的窗体句柄。可以理解,先调用InitHalcon(),然后调用RunHalcon(HTuple  window)就可得到结果。

5)在上一篇文章中使用导出类可以这样表示:

5.1)声明导出类并初始化:

HDevelopExport hdev_export;
...
hdev_export = new HDevelopExport();

5.2)Halcon显示控件的初始化:

private void HSmartWindowControlWPF1_HInitWindow(object sender, EventArgs e)
{
       HTuple width, height;
       hdev_export.hv_ExpDefaultWinHandle = hSmartWindowControlWPF1.HalconID;
       HOperatorSet.ReadImage(out background_image, "fabrik");    //read image
       HOperatorSet.GetImageSize(background_image, out width, out height);
       hSmartWindowControlWPF1.HalconWindow.SetPart(0.0, 0.0, height - 1, width - 1);
       hSmartWindowControlWPF1.HalconWindow.AttachBackgroundToWindow(new HImage(background_image));    //show image
       display_results_delegate = new DisplayResultsDelegate(() =>
       {
           lock(image_lock)
           {
               if (ho_EdgeAmplitude != null)
                   hdev_export.display_results(ho_EdgeAmplitude);
           }
       });    //using lambda to define an anonymous delegate
       cb = new HDrawingObject.HDrawingObjectCallback(DisplayCallback);    //define draawing object callback
 }
 protected void DisplayCallback(IntPtr draw_id, IntPtr window_handle, string type)
 {
       //on callback, process and display image
       lock(image_lock)
       {
           hdev_export.process_image(background_image, out ho_EdgeAmplitude, hSmartWindowControlWPF1.HalconID, draw_id);
       }
       //you need to switch to the UI thread to display the results
       Dispatcher.BeginInvoke(display_results_delegate);
 }

5.3)补充一个右击画矩形的Click事件处理过程:

private void OnRectangle1_Click(object sender, RoutedEventArgs e)
{
     HTuple draw_id;
     hdev_export.add_new_drawing_object("rectangle1", hSmartWindowControlWPF1.HalconID, out draw_id);
     SetCallbacks(draw_id);
}

上面的红色字体部分就是我们导出为C#代码时的子函数,也就是说,实际应用中可以抛弃导出代码中的InitHalcon,RunHalcon,直接分部按需使用。

6)如何使我们在跟新HDevelop中的脚本文件时,对应的*.cs文件也自动更新?原始实例中提供了一个实例,把以下命令行放到生成事件命令行(R)处:

hdevelop -convert "$(ProjectDir)..\source\image_processing.hdev" "$(ProjectDir)..\source\image_processing.cs"
这部分没有测试过,不知是否有遗漏。

猜你喜欢

转载自blog.csdn.net/huan_126/article/details/80225910