【03】大恒相机SDK C#开发 —— 回调采集图像,关闭相机

发布于:2025-08-01 ⋅ 阅读:(17) ⋅ 点赞:(0)

在上一讲,基础上继续修改代码:

1 回调采集图像、

1.1 创建回调函数

//创建回调函数
//其中回调函数中包含一个自定义变量和一个图像数据

        //创建回调函数
        //其中回调函数中包含一个自定义变量和一个图像数据
        public static void _CallCaptureBack(object userParam, IFrameData frameData)
        {
            //获取并打印图像宽高
            ulong height = frameData.GetHeight();
            ulong width = frameData.GetWidth();
            Console.WriteLine("图像高:" + height.ToString() + "宽 :" + width.ToString());
        }

回调函数创建完成后,需要在相机流对象中进行注册;

void RegisterCaptureCallback(object objUserParam, CaptureDelegate delCaptureFun);

1.2 注册回调函数

需要注意的是,注册回调函数需要在流通道开始采集之前进行;
自定义参数可以是任意参数,调第二个参数则为刚才创建的回调函数;

    //注册回调函数

    //RegisterCaptureCallback(,)自定义参数可以是任意参数,调第二个参数则为刚才创建的回调函数;
    cam_stream.RegisterCaptureCallback(cam,_CallCaptureBack);

1.3 运行测试

在这里插入图片描述
完整代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GxIAPINET;

namespace DaHC_
{
    internal class Program
    {
        static void Main(string[] args)
        {
 //首先,找到相机

            //第一步,对相机资源进行初始化
            IGXFactory.GetInstance().Init();

            //第二部,枚举相机

            //先定义一个设备列表,用来存放枚举到的设备
            List<IGXDeviceInfo> iGXDeviceInfos = new List<IGXDeviceInfo>();

            //枚举同一网段下的相机 无ALL
            IGXFactory.GetInstance().UpdateDeviceList(1000,iGXDeviceInfos);
            //枚举同一网络下所有相机 有ALL
            //IGXFactory.GetInstance().UpdateAllDeviceList(1000, iGXDeviceInfos);

            //第三步,获取相机信息,如IP、ID、SN等
            //枚举到相机后,就可以获取到相机的一些设备信息
            string IP = iGXDeviceInfos[0].GetIP();
            string ID = iGXDeviceInfos[0].GetSN();
            string SN = iGXDeviceInfos[0].GetSN(); 

            Console.WriteLine("第一个设备的IP:"+ IP);
            Console.WriteLine("第一个设备的ID:"+ ID);
            Console.WriteLine("第一个设备的SN:"+ SN);

            //第四步,打开相机,可以通过IP、SN、MAC、ID等唯一标识符打开相机
            //这里通过SN打开相机,打开相机的方式有三种: 只读、控制、独占
            IGXDevice cam = IGXFactory.GetInstance().OpenDeviceBySN(SN, GX_ACCESS_MODE.GX_ACCESS_CONTROL);//控制方式打开


            //第五步,打开相机后,准备开始采集图像
            //首先打开流通道
            //uint cam_num = cam.GetStreamCount();
            IGXStream cam_stream = cam.OpenStream(0);//默认打开第一个流通道   

            //注册回调函数
            //RegisterCaptureCallback(,)自定义参数可以是任意参数,调第二个参数则为刚才创建的回调函数;
            cam_stream.RegisterCaptureCallback(cam,_CallCaptureBack);

            //流通道开始采集
            cam_stream.StartGrab();
            //获取远端属性控制器
            IGXFeatureControl cam_remote_control = cam.GetRemoteFeatureControl();
            //发送开采命令,设备参数字符串可以去文档里查看
            cam_remote_control.GetCommandFeature("AcquisitionStart").Execute();
    
        }

        //创建回调函数
        //其中回调函数中包含一个自定义变量和一个图像数据
        public static void _CallCaptureBack(object userParam, IFrameData frameData)
        {
            //获取并打印图像宽高
            ulong height = frameData.GetHeight();
            ulong width = frameData.GetWidth();
            Console.WriteLine("图像高:" + height.ToString() + "宽 :" + width.ToString());
        }
    }
}

2 停止采集和关闭相机

  • 停止采集和开始采集的方法是相同的;区别只在于发送的字符命令不同;

  • 关闭相机首先需要先停止流采集;再注销前面所注册的所有回调函数;

  • 最后记得通过反初始化释放所有资源;

//停止采集和关闭相机
//关闭相机首先需要先停止流采集;再注销前面所注册的所有回调函数;

    //停止采集和关闭相机
    //关闭相机首先需要先停止流采集;再注销前面所注册的所有回调函数;

    //关闭采集命令
    cam_remote_control.GetCommandFeature("AcquisitionStop").Execute();
    //关闭流通道
    cam_stream.StopGrab();
    //关闭回调函数
    cam_stream.UnregisterCaptureCallback();
    //最后通过反初始化释放所有资源;
    IGXFactory.GetInstance().Uninit();

需要打断点,运行后,按F0 调试,才可以看到 图像输出 宽、高;

否则,运行一闪而过就没了;还没来的及输出,流就被关闭了,输出窗口也会变关闭;
在这里插入图片描述
完整代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GxIAPINET;

namespace DaHC_
{
    internal class Program
    {
        static void Main(string[] args)
        {
 //首先,找到相机

            //第一步,对相机资源进行初始化
            IGXFactory.GetInstance().Init();

            //第二部,枚举相机

            //先定义一个设备列表,用来存放枚举到的设备
            List<IGXDeviceInfo> iGXDeviceInfos = new List<IGXDeviceInfo>();

            //枚举同一网段下的相机 无ALL
            IGXFactory.GetInstance().UpdateDeviceList(1000,iGXDeviceInfos);
            //枚举同一网络下所有相机 有ALL
            //IGXFactory.GetInstance().UpdateAllDeviceList(1000, iGXDeviceInfos);

            //第三步,获取相机信息,如IP、ID、SN等
            //枚举到相机后,就可以获取到相机的一些设备信息
            string IP = iGXDeviceInfos[0].GetIP();
            string ID = iGXDeviceInfos[0].GetSN();
            string SN = iGXDeviceInfos[0].GetSN(); 

            Console.WriteLine("第一个设备的IP:"+ IP);
            Console.WriteLine("第一个设备的ID:"+ ID);
            Console.WriteLine("第一个设备的SN:"+ SN);
//打开相机
            //第四步,打开相机,可以通过IP、SN、MAC、ID等唯一标识符打开相机
            //这里通过SN打开相机,打开相机的方式有三种: 只读、控制、独占
            IGXDevice cam = IGXFactory.GetInstance().OpenDeviceBySN(SN, GX_ACCESS_MODE.GX_ACCESS_CONTROL);//控制方式打开

//准备开始采集图像

            //第五步,打开相机后,准备开始采集图像
            //首先打开流通道
            //uint cam_num = cam.GetStreamCount();
            IGXStream cam_stream = cam.OpenStream(0);//默认打开第一个流通道   

            //注册回调函数
            //RegisterCaptureCallback(,)自定义参数可以是任意参数,调第二个参数则为刚才创建的回调函数;
            cam_stream.RegisterCaptureCallback(cam,_CallCaptureBack);

            //流通道开始采集
            cam_stream.StartGrab();
            //获取远端属性控制器
            IGXFeatureControl cam_remote_control = cam.GetRemoteFeatureControl();
            //发送开采命令,设备参数字符串可以去文档里查看
            cam_remote_control.GetCommandFeature("AcquisitionStart").Execute();


//停止采集和关闭相机

            //关闭相机首先需要先停止流采集;再注销前面所注册的所有回调函数;

            //关闭采集命令
            cam_remote_control.GetCommandFeature("AcquisitionStop").Execute();
            //关闭流通道
            cam_stream.StopGrab();
            //关闭回调函数
            cam_stream.UnregisterCaptureCallback();
            //最后通过反初始化释放所有资源;
            IGXFactory.GetInstance().Uninit();
        }

        //创建回调函数
        //其中回调函数中包含一个自定义变量和一个图像数据
        public static void _CallCaptureBack(object userParam, IFrameData frameData)
        {
            //获取并打印图像宽高
            ulong height = frameData.GetHeight();
            ulong width = frameData.GetWidth();
            Console.WriteLine("图像高:" + height.ToString() + "宽 :" + width.ToString());
        }
    }
}

3 视频教程

【大恒工业相机SDK开发C#版】回调采集图像,关闭相机