帧采集器连接相机,Halcon连接相机

一: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;
        }
相关推荐
_李小白11 小时前
【Android 美颜相机】第二十三天:GPUImageDarkenBlendFilter(变暗混合滤镜)
android·数码相机
JMchen12315 小时前
Android计算摄影实战:多帧合成、HDR+与夜景算法深度剖析
android·经验分享·数码相机·算法·移动开发·android-studio
leiming618 小时前
Qt视频监控系统开发实战:从视频捕获到照片管理
linux·数码相机·音视频
ZPC821021 小时前
机器人手眼标定
人工智能·python·数码相机·算法·机器人
格林威1 天前
Baumer相机碳纤维布纹方向识别:用于复合材料铺层校验的 5 个核心技巧,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·视觉检测
格林威1 天前
Baumer相机视野内微小缺陷增强检测:提升亚像素级瑕疵可见性的 7 个核心方法,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·视觉检测·工业相机
格林威2 天前
Baumer相机金属焊缝缺陷识别:提升焊接质量检测可靠性的 7 个关键技术,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·视觉检测·堡盟相机
格林威2 天前
Baumer相机金属弹簧圈数自动计数:用于来料快速检验的 6 个核心算法,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·视觉检测·堡盟相机
码农三叔2 天前
(8-2)传感器系统与信息获取:外部环境传感
人工智能·嵌入式硬件·数码相机·机器人·人形机器人
暮志未晚Webgl3 天前
UE5使用CameraShake相机震动提升游戏体验
数码相机·游戏·ue5