1、简介
halcon可以非常简单地实现相机的调用,并转为C#/C++等语言进行开发。这里贴出简单的获取相机流显示图片的代码
之前尝试使用basler相机,比较繁琐,因为basler相机采用线程、回调等方式实现,这些都没有封装起来,对初学者很不友好。其实只需要使用halcon相机助手就可以简简单单地获取图片了(当然,前提是该相机可以被halcon识别,一般主流的相机都是可以被halcon支持的)
2、代码
public partial class Form1 : Form
{
// Local iconic variables
HObject ho_Image = null;
// Local control variables
HTuple hv_AcqHandle = null;
HTuple hv_WindowHandle = null;
//初始化
public Form1()
{
InitializeComponent();
HOperatorSet.GenEmptyObj(out ho_Image);
//这个步骤根据不同相机有所不同,不可照搬,下文会讲解
HOperatorSet.OpenFramegrabber("GigEVision", 0, 0, 649, 494, 0, 0, "default", -1,
"default", -1, "false", "default", "0030531570a0_Basler_acA64090gm", 0, -1,
out hv_AcqHandle);
HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
ho_Image.Dispose();
}
//连接相机
public void openCamera()
{
if (HDevWindowStack.IsOpen())
{
HOperatorSet.CloseWindow(HDevWindowStack.Pop());
}
HOperatorSet.SetWindowAttr("background_color", "black");
//显示图片
//HOperatorSet.OpenWindow(0, 0, hWindowControl1.Width, hWindowControl1.Height, hWindowControl1.HalconWindow, "", "", out hv_WindowHandle);
HOperatorSet.OpenWindow(0, 0, pictureBox1.Width, pictureBox1.Height, pictureBox1.Handle, "", "", out hv_WindowHandle);
HDevWindowStack.Push(hv_WindowHandle);
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
}
}
//添加定时器的控件,设置使能状态为false(一般默认就是false),时间间隔调节短一些,避免画面延迟。
private void timer1_Tick(object sender, EventArgs e)
{
openCamera();
}
//这里设置了一个按钮,开始获取图片
private void btnOneShoot_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
}
效果是这样的,至于关闭、保存图片之类的就比较简单了,可以自己发挥。同理,掌握了这个其他相机的连接也是一样的,这样就可以直接跳过相机厂商的链接库。这里写”拍照“不合适,其实它一直在定时跟新图片。因此效果就跟录像一样。如果你需要拍一张照片的功能,就不要使用定时器,或者把定时器关闭了。另外,如果需要保存图片,就把ho_image做一下处理,或者直接pictureBox.Image.Save(path, System.Drawing.Imaging.ImageFormat.Bmp);这里两个参数是保存路径和保存格式。
3、设置
1、打开halcon——助手——打开新的Image Aquisition——自动检测接口——代码生成,将生成的代码部分代替上文:
HOperatorSet.OpenFramegrabber(“GigEVision”, 0, 0, 649, 494, 0, 0, “default”, -1,“default”, -1, “false”, “default”, “0030531570a0_Basler_acA64090gm”, 0, -1,out hv_AcqHandle);
2、如果你是使用halcon自带的控件:HWindowControl(C:\Program Files\MVTec\HALCON-12.0\bin\dotnet35,查找你的安装包大概这个路径,将halcondonet.dll拖入vs的工具箱即可),那么你可以这样显示图片:
HOperatorSet.OpenWindow(0, 0, hWindowControl1.Width, hWindowControl1.Height, hWindowControl1.HalconWindow, “”, “”, out hv_WindowHandle);
3、如果你是用pictureBox显示图片,那么你可以这样写:
HOperatorSet.OpenWindow(0, 0, pictureBox1.Width, pictureBox1.Height, pictureBox1.Handle, “”, “”, out hv_WindowHandle);