【01】大恒相机SDK C++开发 —— 初始化相机,采集第一帧图像、回调采集、关闭相机

发布于:2025-08-03 ⋅ 阅读:(11) ⋅ 点赞:(0)

1 初始化相机,采集第一帧图像

#include <iostream>
#include <GalaxyIncludes.h>
using namespace std;

int main()
{
    //首先,对相机资源进行初始化
    IGXFactory::GetInstance().Init();
    //第二部,枚举相机//先定义一个设备列表,用来存放枚举到的设备
    GxIAPICPP::gxdeviceinfo_vector cam_list;
    //枚举同一网段下的相机 无ALL
    IGXFactory::GetInstance().UpdateDeviceList(1000,cam_list);
    //枚举同一网络下所有相机 有ALL
    //IGXFactory::GetInstance().UpdateAllDeviceList(1000, cam_list);


    //打印设备的SN码、设备名称、制造商
    //枚举到相机后,就可以获取到相机的一些设备信息
    int cam_num = cam_list.size();

    GxIAPICPP::gxstring sn = cam_list[0].GetSN();
    GxIAPICPP::gxstring id = cam_list[0].GetDeviceID();
    GxIAPICPP::gxstring cmpy = cam_list[0].GetVendorName();

    std::cout << "检测到 " << cam_num << " 台相机 \r\n";
    std::cout << "SN码: " << sn << "\r\n";
    std::cout << "相机ID: " << id << "\r\n";
    std::cout << "制造商: " << cmpy << "\r\n";

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


    //打开相机后,准备开始采集图像
    //首先打开流通道
    CGXStreamPointer cam_stream = cam->OpenStream(0);//默认打开第一个流通道
    //获取远端属性控制器
    CGXFeatureControlPointer cam_remote_control = cam->GetRemoteFeatureControl();

    //流通道开始采集
    cam_stream->StartGrab();
    //发送开采命令
    cam_remote_control->GetCommandFeature("AcquisitionStart")->Execute();
    //采集一帧图像
    CImageDataPointer img = cam_stream->GetImage(1000);//采集超时时间ms

    //获取并打印图像宽高
    uint16_t height = img->GetHeight();
    uint16_t width = img->GetWidth();
    std::cout << "图像高: " << height << "\t宽:"<<width<<"\r\n";



    return 0;

}

在这里插入图片描述

2 回调方式采集图像

#include <iostream>
#include <GalaxyIncludes.h>
using namespace std;

//注意:回调函数要放在main函数之前,否则报错

//首先创建一个回调函数
//创建一个类,集成回调事件类

int main()
{
    //对回调函数进行注册
    //声明采集回调事件的对象指针,并且创建指针对象
    ICaptureEventHandler* pCaptureHandler = NULL;
    pCaptureHandler = new MyCaptureEvent();

    //对相机资源进行初始化
    IGXFactory::GetInstance().Init();
    //第二部,枚举相机//先定义一个设备列表,用来存放枚举到的设备
    GxIAPICPP::gxdeviceinfo_vector cam_list;
    //枚举同一网段下的相机 无ALL
    IGXFactory::GetInstance().UpdateDeviceList(1000,cam_list);
    //枚举同一网络下所有相机 有ALL
    //IGXFactory::GetInstance().UpdateAllDeviceList(1000, cam_list);


    //打印设备的SN码、设备名称、制造商
    //枚举到相机后,就可以获取到相机的一些设备信息
    int cam_num = cam_list.size();

    GxIAPICPP::gxstring sn = cam_list[0].GetSN();
    GxIAPICPP::gxstring id = cam_list[0].GetDeviceID();
    GxIAPICPP::gxstring cmpy = cam_list[0].GetVendorName();

    std::cout << "检测到 " << cam_num << " 台相机 \r\n";
    std::cout << "SN码: " << sn << "\r\n";
    std::cout << "相机ID: " << id << "\r\n";
    std::cout << "制造商: " << cmpy << "\r\n";

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


    //打开相机后,准备开始采集图像
    //首先打开流通道
    CGXStreamPointer cam_stream = cam->OpenStream(0);//默认打开第一个流通道
    //获取远端属性控制器
    CGXFeatureControlPointer cam_remote_control = cam->GetRemoteFeatureControl();
    
    //注册回调函数
    cam_stream->RegisterCaptureCallback(pCaptureHandler,NULL);

    //流通道开始采集
    cam_stream->StartGrab();
    //发送开采命令
    cam_remote_control->GetCommandFeature("AcquisitionStart")->Execute();

    //采集一帧图像
    //CImageDataPointer img = cam_stream->GetImage(1000);//采集超时时间ms

    //当还在采集主函数就执行完毕了,会报错,加一个阻塞
    getchar();

    //采集完毕,停止采集,关闭相机

    //远端属性控制器发送停止命令
    cam_remote_control->GetCommandFeature("AcqisitionStop")->Execute();
    //流通道停止采集
    cam_stream->StopGrab();
    //流通道关闭
    cam_stream->Close();
    //相机关闭
    cam->Close();
    //然后释放我们所有的相机资源
    IGXFactory::GetInstance().Uninit();

    return 0;

}

class MyCaptureEvent : public ICaptureEventHandler
{
public:
    void DoOnImageCaptured(CImageDataPointer& img, void* userparam)
    {
        //获取并打印图像宽高
        uint16_t height = img->GetHeight();
        uint16_t width = img->GetWidth();
        std::cout << "图像高: " << height << "\t宽:" << width << "\r\n";
    }

};

在这里插入图片描述

//注意:回调函数要放在main函数之前,否则报错
在这里插入图片描述

3 视频教程

【大恒工业相机SDK开发C++版】初始化相机,采集第一帧图像


网站公告

今日签到

点亮在社区的每一天
去签到