一:CogFrameGrabbers
ICogAcqFifo myacq=null;
//抓取连接硬件的接口
CogFrameGrabbers myfgs = null;
private void LoadAcq() {
//初始化帧抓取器
myfgs=new CogFrameGrabbers();
//判断是否有连接硬件
if (myfgs.Count > 0)
{
//连接相机
foreach (ICogFrameGrabber f in myfgs)
{
//将抓取到的接口赋值给相机接口
myacq = f.CreateAcqFifo("Generic GigEVision (Mono)", CogAcqFifoPixelFormatConstants.Format8Grey, 0, true);
CameraName=f.Name;
}
}
else {
MessageBox.Show("没有连接相机");
}
}
使用相机接口进行连接
相机参数设置:
myacq.OwnedExposureParams.Exposure = Convert.ToDouble(IniSave.Read("Exposure"));
myacq.OwnedBrightnessParams.Brightness = Convert.ToDouble(IniSave.Read("Brightness"));
myacq.OwnedContrastParams.Contrast = Convert.ToDouble(IniSave.Read("Contrast"));
二:Halcon连接相机
// 连接相机
public void ConnectCamera()
{
try
{
/* 1. 打开相机
* 告诉 HALCON:我要用 GigE Vision 2.0 协议去捡一个网口相机。
* 后面一长串参数基本都是从 HDevelop 的"助手-打开帧抓取器"里
* 直接抄过来的,含义如下:
* "GigEVision2" -> 驱动名称
* 第 2~5 个 0 -> 默认分辨率/起始行列(让相机自己报)
* 0, 0 -> 颜色空间、相机类型默认
* "progressive" -> 逐行扫描
* -1, "default" -> 外触发默认关闭
* -1, "false" -> 不自动切换参数集
* "default" -> 相机描述文件用默认
* "34bd2038abff_Hikrobot_MVCS06010GC" -> 相机的唯一 ID(序列号)
* 0, -1 -> 端口、超时默认
* 执行完后,HALCON 把相机句柄塞进 hv_AcqHandle,后面所有操作都靠它。
*/
HOperatorSet.OpenFramegrabber("GigEVision2", 0, 0, 0, 0, 0, 0, "progressive",
-1, "default", -1, "false", "default",
"34bd2038abff_Hikrobot_MVCS06010GC",
0, -1, out hv_AcqHandle);
/* 2. 关闭触发模式
* 把相机设成"连续采集"(自由运行),不等待外部硬触发。
*/
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "TriggerMode", "Off");
/* 3. 启动采集队列
* 让 HALCON 在后台开始预抓取 1 张图(-1=默认缓冲数),
* 以后直接 GrabImageAsync() 就能瞬间拿到最新帧。
*/
HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
MessageBox.Show("相机连接成功");
}
catch (Exception ex)
{
MessageBox.Show("相机连接失败");
}
}
关闭相机
public void CloseCamera() {
//停止采图
isCameraConnected = true;
//关闭线程
if (thread != null && thread.IsAlive) {thread.Abort(); }
//关闭相机
if (hv_AcqHandle != null)
{
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
//释放资源
if (getimage != null) {getimage.Dispose(); }
MessageBox.Show("相机已关闭");
//清除窗口显示的图像
HOperatorSet.ClearWindow(WindowID);
}
ShowData(DateTime.Now.ToString()+"相机已关闭\r\n");
}
实时显示:
private void 实时显示ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (hv_AcqHandle == null)
{
MessageBox.Show("请先连接相机");
}
isCameraConnected = false;
thread = new Thread(() => {
while (!isCameraConnected)
{
try
{
//异步抓取图像
HOperatorSet.GrabImageAsync(out getimage, hv_AcqHandle, -1);
//获取图像大小(自适应需要)
HOperatorSet.GetImageSize(getimage, out HTuple width, out HTuple height);
//设置显示区域
HOperatorSet.SetPart(WindowID, 0, 0, width - 1, height - 1);
//显示
HOperatorSet.DispImage(getimage, WindowID);
getimage.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
});
thread.IsBackground = true;
thread.Start();
}
拍照:
private HObject outimage;
private void 拍照ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (hv_AcqHandle == null)
{
MessageBox.Show("请先连接相机");
return;
}
try
{
//停止实时显示
isCameraConnected = true;
//等待线程释放句柄
Thread.Sleep(100);
//异步抓取图像
HOperatorSet.GrabImageAsync(out outimage, hv_AcqHandle, -1);
//获取图像大小(自适应需要)
HOperatorSet.GetImageSize(outimage, out HTuple width, out HTuple height);
//设置显示区域
HOperatorSet.SetPart(WindowID, 0, 0, width - 1, height - 1);
//显示
HOperatorSet.DispImage(outimage, WindowID);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//拍完照之后,继续实时显示
isCameraConnected = false;
}