首先第一步用Haclon软件写好实时采集代码:
* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', '000f314ccf51_AlliedVisionTechnologies_Manta_G125BE0020002', 0, -1, AcqHandle)
*打开相机对待侧物体进行测量
grab_image_start (AcqHandle, -1)
while(true)
grab_image_async (Image, AcqHandle, -1)
get_image_size (Image, Width, Height)
dev_set_part (0, 0, Height, Width)
endwhile
close_framegrabber (AcqHandle)
然后打开文件菜单栏选择到处语言导出C# xxx.CS文件,
导出C#代码:
using HalconDotNet;
public partial class HDevelopExport
{
#if !(NO_EXPORT_MAIN || NO_EXPORT_APP_MAIN)
public HDevelopExport()
{
// Default settings used in HDevelop
HOperatorSet.SetSystem("width", 512);
HOperatorSet.SetSystem("height", 512);
if (HalconAPI.isWindows)
HOperatorSet.SetSystem("use_window_thread","true");
action();
}
#endif
// Procedures
// Chapter: Graphics / Text
// Short Description: This procedure writes one or multiple text messages.
public void disp_message (HTuple hv_WindowHandle, HTuple hv_String, HTuple hv_CoordSystem,
HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box)
{
HTuple hv_GenParamName = new HTuple(), hv_GenParamValue = new HTuple();
HTuple hv_Color_COPY_INP_TMP = new HTuple(hv_Color);
HTuple hv_Column_COPY_INP_TMP = new HTuple(hv_Column);
HTuple hv_CoordSystem_COPY_INP_TMP = new HTuple(hv_CoordSystem);
HTuple hv_Row_COPY_INP_TMP = new HTuple(hv_Row);
//Convert the parameters for disp_text.
if ((int)((new HTuple(hv_Row_COPY_INP_TMP.TupleEqual(new HTuple()))).TupleOr(
new HTuple(hv_Column_COPY_INP_TMP.TupleEqual(new HTuple())))) != 0)
{
hv_Color_COPY_INP_TMP.Dispose();
hv_Column_COPY_INP_TMP.Dispose();
hv_CoordSystem_COPY_INP_TMP.Dispose();
hv_Row_COPY_INP_TMP.Dispose();
hv_GenParamName.Dispose();
hv_GenParamValue.Dispose();
return;
}
if ((int)(new HTuple(hv_Row_COPY_INP_TMP.TupleEqual(-1))) != 0)
{
hv_Row_COPY_INP_TMP.Dispose();
hv_Row_COPY_INP_TMP = 12;
}
if ((int)(new HTuple(hv_Column_COPY_INP_TMP.TupleEqual(-1))) != 0)
{
hv_Column_COPY_INP_TMP.Dispose();
hv_Column_COPY_INP_TMP = 12;
}
//
//Convert the parameter Box to generic parameters.
hv_GenParamName.Dispose();
hv_GenParamName = new HTuple();
hv_GenParamValue.Dispose();
hv_GenParamValue = new HTuple();
if ((int)(new HTuple((new HTuple(hv_Box.TupleLength())).TupleGreater(0))) != 0)
{
if ((int)(new HTuple(((hv_Box.TupleSelect(0))).TupleEqual("false"))) != 0)
{
//Display no box
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_GenParamName = hv_GenParamName.TupleConcat(
"box");
hv_GenParamName.Dispose();
hv_GenParamName = ExpTmpLocalVar_GenParamName;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_GenParamValue = hv_GenParamValue.TupleConcat(
"false");
hv_GenParamValue.Dispose();
hv_GenParamValue = ExpTmpLocalVar_GenParamValue;
}
}
}
else if ((int)(new HTuple(((hv_Box.TupleSelect(0))).TupleNotEqual("true"))) != 0)
{
//Set a color other than the default.
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_GenParamName = hv_GenParamName.TupleConcat(
"box_color");
hv_GenParamName.Dispose();
hv_GenParamName = ExpTmpLocalVar_GenParamName;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_GenParamValue = hv_GenParamValue.TupleConcat(
hv_Box.TupleSelect(0));
hv_GenParamValue.Dispose();
hv_GenParamValue = ExpTmpLocalVar_GenParamValue;
}
}
}
}
if ((int)(new HTuple((new HTuple(hv_Box.TupleLength())).TupleGreater(1))) != 0)
{
if ((int)(new HTuple(((hv_Box.TupleSelect(1))).TupleEqual("false"))) != 0)
{
//Display no shadow.
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_GenParamName = hv_GenParamName.TupleConcat(
"shadow");
hv_GenParamName.Dispose();
hv_GenParamName = ExpTmpLocalVar_GenParamName;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_GenParamValue = hv_GenParamValue.TupleConcat(
"false");
hv_GenParamValue.Dispose();
hv_GenParamValue = ExpTmpLocalVar_GenParamValue;
}
}
}
else if ((int)(new HTuple(((hv_Box.TupleSelect(1))).TupleNotEqual("true"))) != 0)
{
//Set a shadow color other than the default.
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_GenParamName = hv_GenParamName.TupleConcat(
"shadow_color");
hv_GenParamName.Dispose();
hv_GenParamName = ExpTmpLocalVar_GenParamName;
}
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
{
HTuple
ExpTmpLocalVar_GenParamValue = hv_GenParamValue.TupleConcat(
hv_Box.TupleSelect(1));
hv_GenParamValue.Dispose();
hv_GenParamValue = ExpTmpLocalVar_GenParamValue;
}
}
}
}
//Restore default CoordSystem behavior.
if ((int)(new HTuple(hv_CoordSystem_COPY_INP_TMP.TupleNotEqual("window"))) != 0)
{
hv_CoordSystem_COPY_INP_TMP.Dispose();
hv_CoordSystem_COPY_INP_TMP = "image";
}
//
if ((int)(new HTuple(hv_Color_COPY_INP_TMP.TupleEqual(""))) != 0)
{
//disp_text does not accept an empty string for Color.
hv_Color_COPY_INP_TMP.Dispose();
hv_Color_COPY_INP_TMP = new HTuple();
}
//
HOperatorSet.DispText(hv_WindowHandle, hv_String, hv_CoordSystem_COPY_INP_TMP,
hv_Row_COPY_INP_TMP, hv_Column_COPY_INP_TMP, hv_Color_COPY_INP_TMP, hv_GenParamName,
hv_GenParamValue);
hv_Color_COPY_INP_TMP.Dispose();
hv_Column_COPY_INP_TMP.Dispose();
hv_CoordSystem_COPY_INP_TMP.Dispose();
hv_Row_COPY_INP_TMP.Dispose();
hv_GenParamName.Dispose();
hv_GenParamValue.Dispose();
return;
}
#if !NO_EXPORT_MAIN
// Main procedure
private void action()
{
// Local iconic variables
HObject ho_Image, ho_Regions, ho_ConnectedRegions;
HObject ho_SelectedRegions, ho_RegionFillUp, ho_Contours1;
// Local control variables
HTuple hv_CameraParameters = new HTuple();
HTuple hv_CameraPose = new HTuple(), hv_X = new HTuple();
HTuple hv_Y = new HTuple(), hv_AcqHandle = new HTuple();
HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
HTuple hv_WindowID = new HTuple(), hv_Row2 = new HTuple();
HTuple hv_Column2 = new HTuple(), hv_Radius1 = new HTuple();
HTuple hv_StartPhi1 = new HTuple(), hv_EndPhi1 = new HTuple();
HTuple hv_PointOrder1 = new HTuple(), hv_RealDiameter = new HTuple();
// Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_Image);
HOperatorSet.GenEmptyObj(out ho_Regions);
HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);
HOperatorSet.GenEmptyObj(out ho_SelectedRegions);
HOperatorSet.GenEmptyObj(out ho_RegionFillUp);
HOperatorSet.GenEmptyObj(out ho_Contours1);
//标定得到的相机参数
hv_CameraParameters.Dispose();
hv_CameraParameters = new HTuple();
hv_CameraParameters[0] = 0.189115;
hv_CameraParameters[1] = 87.4045;
hv_CameraParameters[2] = 2.21885e-006;
hv_CameraParameters[3] = 2.2e-006;
hv_CameraParameters[4] = 2700.85;
hv_CameraParameters[5] = -118.133;
hv_CameraParameters[6] = 2592;
hv_CameraParameters[7] = 1944;
//相机在世界坐标系中的位姿
hv_CameraPose.Dispose();
hv_CameraPose = new HTuple();
hv_CameraPose[0] = -0.344824;
hv_CameraPose[1] = 0.0149449;
hv_CameraPose[2] = 10.9193;
hv_CameraPose[3] = 0.721803;
hv_CameraPose[4] = 4.27061;
hv_CameraPose[5] = 0.733757;
hv_CameraPose[6] = 0;
hv_X.Dispose();hv_Y.Dispose();
HOperatorSet.ImagePointsToWorldPlane(hv_CameraParameters, hv_CameraPose, 100,
100, "mm", out hv_X, out hv_Y);
//Image Acquisition 01: Code generated by Image Acquisition 01
hv_AcqHandle.Dispose();
HOperatorSet.OpenFramegrabber("GigEVision2", 0, 0, 0, 0, 0, 0, "progressive",
-1, "default", -1, "false", "default", "000f314ccf51_AlliedVisionTechnologies_Manta_G125BE0020002",
0, -1, out hv_AcqHandle);
//打开相机对待侧物体进行测量
HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
HOperatorSet.WaitSeconds(1);
ho_Image.Dispose();
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
hv_Width.Dispose();hv_Height.Dispose();
HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
HOperatorSet.SetWindowAttr("background_color","black");
HOperatorSet.OpenWindow(0,0,hv_Width,hv_Height,0,"visible","",out hv_WindowID);
HDevWindowStack.Push(hv_WindowID);
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
}
ho_Regions.Dispose();
HOperatorSet.Threshold(ho_Image, out ho_Regions, 20, 255);
ho_ConnectedRegions.Dispose();
HOperatorSet.Connection(ho_Regions, out ho_ConnectedRegions);
ho_SelectedRegions.Dispose();
HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area",
"and", 400000, 10000688);
ho_RegionFillUp.Dispose();
HOperatorSet.FillUp(ho_SelectedRegions, out ho_RegionFillUp);
ho_Contours1.Dispose();
HOperatorSet.GenContourRegionXld(ho_RegionFillUp, out ho_Contours1, "border");
hv_Row2.Dispose();hv_Column2.Dispose();hv_Radius1.Dispose();hv_StartPhi1.Dispose();hv_EndPhi1.Dispose();hv_PointOrder1.Dispose();
HOperatorSet.FitCircleContourXld(ho_Contours1, "algebraic", -1, 0, 0, 3, 1, out hv_Row2,
out hv_Column2, out hv_Radius1, out hv_StartPhi1, out hv_EndPhi1, out hv_PointOrder1);
//显示信息
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
}
if (HDevWindowStack.IsOpen())
{
HOperatorSet.SetDraw(HDevWindowStack.GetActive(), "margin");
}
HOperatorSet.DispCircle(hv_WindowID, hv_Row2, hv_Column2, hv_Radius1);
//disp_circle (WindowID, Row2, Column2, (Row2 + Column2) % 50)
hv_RealDiameter.Dispose();
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
hv_RealDiameter = (hv_Radius1*2)/(100/hv_X);
}
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
disp_message(hv_WindowID, ("实际直径:"+hv_RealDiameter)+"mm", "image", hv_Row2,
hv_Column2, "black", "true");
}
// stop(...); only in hdevelop
ho_Image.Dispose();
ho_Regions.Dispose();
ho_ConnectedRegions.Dispose();
ho_SelectedRegions.Dispose();
ho_RegionFillUp.Dispose();
ho_Contours1.Dispose();
hv_CameraParameters.Dispose();
hv_CameraPose.Dispose();
hv_X.Dispose();
hv_Y.Dispose();
hv_AcqHandle.Dispose();
hv_Width.Dispose();
hv_Height.Dispose();
hv_WindowID.Dispose();
hv_Row2.Dispose();
hv_Column2.Dispose();
hv_Radius1.Dispose();
hv_StartPhi1.Dispose();
hv_EndPhi1.Dispose();
hv_PointOrder1.Dispose();
hv_RealDiameter.Dispose();
}
#endif
}
在C#开发时,需摘抄部分代码移植到项目工程中,
工程界面:
工程代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HalconDotNet;
using System.Threading; //开线程取图
namespace haclonC
{
public partial class Form1 : Form
{
//HTuple hv_WindowId;
//HTuple hv_AcqHandle;
// HObject ho_Image;
//HTuple hv_With, hv_Height;
bool m_fContinueGrab = false;
public Form1()
{
InitializeComponent();
}
HObject ho_Image = null;
HTuple hv_AcqHandle = new HTuple();
HTuple hv_Width = new HTuple();
HTuple hv_Height = new HTuple();
Thread thContiGrab;
private void buttonpaizhao_Click(object sender, EventArgs e)
{
if(m_fContinueGrab == false)
{
m_fContinueGrab = true;
thContiGrab = new Thread(ThreadContinueGrab);
thContiGrab.Start();
thContiGrab.IsBackground = true;
buttonpaizhao.Text = "停止";
}
else
{
m_fContinueGrab = false;
thContiGrab.Abort();
buttonpaizhao.Text = "实时";
}
}
private void ThreadContinueGrab()
{
while(true)
{
//先销毁对象,否则就会造成内存泄漏
ho_Image.Dispose();
//采图显示
HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle);
//HOperatorSet.DispObj(ho_Image,hv_WindowId);
}
}
private void button1_Click(object sender, EventArgs e)
{
HOperatorSet.GenEmptyObj(out ho_Image);
hv_AcqHandle.Dispose();
HOperatorSet.OpenFramegrabber("GigEVision2", 0, 0, 0, 0, 0, 0, "progressive",
-1, "default", -1, "false", "default", "000f314ccf51_AlliedVisionTechnologies_Manta_G125BE0020002",
0, -1, out hv_AcqHandle);
HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
}
HTuple hv_WindowHandle = new HTuple();
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
HOperatorSet.OpenWindow(0, 0, hWindowControl1.Width, hWindowControl1.Height, hWindowControl1.HalconWindow, "visible", "", out hv_WindowHandle);
HDevWindowStack.Push(hv_WindowHandle);//入栈
}
private void timer1_tick(object sender, EventArgs e)
{
ho_Image.Dispose();
//hv_AcqHandle.Dispose();
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
//Image Acquisition 01: Do something
hv_Width.Dispose(); hv_Height.Dispose();
HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
if (HDevWindowStack.IsOpen())
{
HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height, hv_Width);
}
if (HDevWindowStack.IsOpen())//实时显示
{
HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
}
}
private void hWindowControl1_Load(object sender, EventArgs e)
{
}
private void button3_Click(object sender, EventArgs e)
{
timer1.Enabled = false;//一定要关闭timer
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
ho_Image.Dispose();
}
}
}
结果显示,