目前业内流行的相机除Basler相机以外都有提供给halcon更兼容的动态链接库,虽然说halcon自带的GigE接口能兼容一般GigE接口的相机但是对于较低版本的halcon来说导出来的外部程序可能无法打开相机,就比如我使用的halcon12版本的导出C#程序后出现无法打开相机切卡死的情况。
1、进入海康威视的安装目录
2、进入对应版本的halcon文件夹
3、复制hAcqMVision.dll到halcon安装目录下的 bin > x64-win64(对应电脑的操作系统)
4、找到 MVision 接口,连接相机可行后导出代码即可
窗口设计:
代码:
public partial class Form1 : Form
{
//相机句柄
HTuple hv_AcqHandle = null;
//halcon窗口句柄
HTuple handle;
//单采集的图像
HObject image = null;
//抓取图像的线程
Thread brabT;
//线程开关
bool isRun = true;
public Form1()
{
InitializeComponent();
handle = hWindowControl1.HalconWindow;
}
#region but事件相关
//打开相机
private void button1_Click(object sender, EventArgs e)
{
openCam();
if (hv_AcqHandle == null)
{
return;
}
brabT = new Thread(brabImage);
//开启线程并挂起它
brabT.Start();
brabT.Suspend();
}
//开始采集
private void button2_Click(object sender, EventArgs e)
{
if (brabT != null)
{
//继续执行线程
brabT.Resume();
}
}
//停止采集
private void button3_Click(object sender, EventArgs e)
{
if (brabT != null)
{
//暂停线程
brabT.Suspend();
}
}
//单采集
private void button4_Click(object sender, EventArgs e)
{
HOperatorSet.GrabImage(out image, hv_AcqHandle);
HOperatorSet.DispImage(image, handle);
}
//当窗口关闭时
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (brabT != null)
{
isRun = false;
//brabT.Join();
//继续执行线程
//brabT.Resume();
终止多余线程
brabT.Abort();
}
}
#endregion
#region 相机相关
//抓取图片线程
private void brabImage()
{
HTuple w, h;
HObject ho_Image;
while (isRun)
{
try
{
HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle);
if (ho_Image != null)
{
HOperatorSet.GetImageSize(ho_Image, out w, out h);
HOperatorSet.SetPart(handle, 0, 0, h, w);
HOperatorSet.DispImage(ho_Image, handle);
//显示玩之后释放图片
ho_Image.Dispose();
}
}
catch (Exception)
{
MessageBox.Show("相机已断开,请重新连接!");
Thread.Sleep(3000);
openCam();
}
}
}
private void openCam() {
//释放相机句柄
HOperatorSet.CloseAllFramegrabbers();
try
{
//连接相机
HOperatorSet.OpenFramegrabber("MVision", 1, 1, 0, 0, 0, 0, "progressive", 8,
"default", -1, "false", "auto", "GEV:00D23303857", 0, -1, out hv_AcqHandle);
MessageBox.Show("相机连接成功!");
}
catch (Exception)
{
MessageBox.Show("相机连接失败!");
}
}
#endregion
}