halcon与python混编_halcon与C#混编的入门贴

这篇主要是C#和Halcon的混合编程,写给新手们看的。

halcon源程序:

dev_open_window(0, 0, 512, 512, 'black', WindowHandle)

read_image (Image, 'C:/Users/Administrator/Desktop/猫.jpg')

dev_display(Image)

get_image_size(Image, Width, Height)

rgb3_to_gray(Image, Image, Image, ImageGray)

dev_display(ImageGray)

注意:写halcon程序时,如果过程中的图片需要显示出来,则需要在每个过程中都添加dev_display(**)

第一步:导出C#程序,建立项目,并添加此类

//

//  File generated by HDevelop for HALCON/DOTNET (C#) Version 10.0

//

//  This file is intended to be used with the HDevelopTemplate or

//  HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c#

usingSystem;

usingHalconDotNet;

publicpartialclassHDevelopExport

{

public HTuple hv_ExpDefaultWinHandle;

// Main procedure

private void action()

{

// Local iconic variables

HObject ho_Image, ho_ImageGray;

// Local control variables

HTuple hv_Width, hv_Height;

// Initialize local and output iconic variables

HOperatorSet.GenEmptyObj(out ho_Image);

HOperatorSet.GenEmptyObj(out ho_ImageGray);

//dev_open_window(...);

ho_Image.Dispose();

HOperatorSet.ReadImage(out ho_Image, "C:/Users/Administrator/Desktop/猫¨.jpg");

HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);

HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);

ho_ImageGray.Dispose();

HOperatorSet.Rgb3ToGray(ho_Image, ho_Image, ho_Image, out ho_ImageGray);

HOperatorSet.DispObj(ho_ImageGray, hv_ExpDefaultWinHandle);

ho_Image.Dispose();

ho_ImageGray.Dispose();

}

public void InitHalcon()

{

// Default settings used in HDevelop

HOperatorSet.SetSystem("do_low_error", "false");

}

public void RunHalcon(HTuple Window)

{

hv_ExpDefaultWinHandle = Window;

action();

}

}

第二步:布局设计

本程序需要显示图片的halconWindow控件和读图以及处理图片的两个button控件;如下图:

第三步:将导出的类进行框架分解

如果想在程序中添加不同的按键,比如一个用来打开图片,一个用来处理图片,则就需要将halcon导出的类进行分解;

框架如下:

//定义变量

//初始化halcon

public void InitHalcon()

{

//初始化halcon程序

}

//读取图片

publicvoidReadPicture(HTuple Window)

{

//读图程序

}

//处理图片

publicvoidProcess()

{

//处理程序

}

第四步:填补框架

将对应框架下得程序进行填补操作(下边程序可以代替publicpartialclassHDevelopExport下的所有程序):

//定义变量

publicHTuple hv_ExpDefaultWinHandle;

HObject ho_Image, ho_ImageGray;

HTuple hv_Width, hv_Height;

//初始化halcon

public void InitHalcon()

{

// Default settings used in HDevelop

HOperatorSet.SetSystem("do_low_error", "false");

}

publicvoidReadPicture(HTuple Window)

{

//读图并显示

hv_ExpDefaultWinHandle = Window;

HOperatorSet.GenEmptyObj(out ho_Image);

ho_Image.Dispose();

HOperatorSet.ReadImage(out ho_Image, "C:/Users/Administrator/Desktop/猫¨.jpg");

HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);

HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);

}

publicvoidProcess()

{

//处理程序

HOperatorSet.GenEmptyObj(outho_ImageGray);

ho_ImageGray.Dispose();

HOperatorSet.Rgb3ToGray(ho_Image, ho_Image, ho_Image, out ho_ImageGray);

HOperatorSet.DispObj(ho_ImageGray, hv_ExpDefaultWinHandle);

ho_Image.Dispose();

ho_ImageGray.Dispose();

}

第五步:在主程序Form1.cs中添加程序:

①在主程序Form1的类下对刚才添加的类进行实例化:

HDevelopExporthd = newHDevelopExport();

②在按键下添加相应程序

privatevoidbutton1_Click(objectsender, EventArgs e)

{

hd.ReadPicture(hWindowControl1.HalconWindow);

}

private void button2_Click(object sender, EventArgs e)

{

hd.Process();

}

此步骤完成之后,程序可以运行。

上面那句:hd.ReadPicture(hWindowControl1.HalconWindow);

不能写成hd.ReadPicture(hWindowControl1.handle);

否则会报下面的错误:

HALCON error #5100:Wrong(logical) window number in operator disp_obj

因为有些算子的参数是传入handle,即halcon窗口的句柄,所以有许多人容易犯这个错误,传入hWindowControl1.handle

附加步骤1:

在以上程序中,已经可以将图片显示出来,并进行处理,但由于窗口与图片的大小不一致,导致在显示窗口中不能适应程序窗口的大小,下面是解决此类问题的方法:

在读图程序中,将获取图片的大小的程序HOperatorSet.GetImageSize(ho_Image,outhv_Width,outhv_Height);放在显示图片之前,并在显示图片程序之前加入下面程序:

HOperatorSet.SetPart(hv_ExpDefaultWinHandle, 0, 0, hv_Height - 1, hv_Width - 1);然后图片就可以适应窗口大小。

此步骤也可以在halcon中更改。

附加步骤2:

如果想在程序中能够打开本地文件夹的图片进行处理,则需要改以下程序:

注意:①②是添加的类中③④是主程序中

①将publicvoidReadPicture(HTuple Window)的括号中加入参数,改为publicvoidReadPicture(HTuple Window,stringImagePath)

②将ReadPicture下的程序HOperatorSet.ReadImage(outho_Image,"C:/Users/Administrator/Desktop/猫¨.jpg");改为HOperatorSet.ReadImage(out ho_Image, ImagePath);

③主程序中定义变量stringImagePath

④将button1的程序改成如下:

privatevoidbutton1_Click(objectsender, EventArgs e)

{

OpenFileDialog openFileDialog1 = new OpenFileDialog();

openFileDialog1.Filter ="JPEG文件|*.jpg*|BMP文件|*.bmp*";

openFileDialog1.RestoreDirectory = true;

openFileDialog1.FilterIndex = 1;

if (openFileDialog1.ShowDialog() == DialogResult.OK)

{

ImagePath = openFileDialog1.FileName;

hd.ReadPicture(hWindowControl1.HalconWindow, ImagePath);

}

}

接下来可以试试运行程序。

---------------------

作者:hackpig

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值