Gige多相机高速拍照模式补充

发布时间:2026/7/31 15:48:57

Gige多相机高速拍照模式补充 软件触发Software Trigger由代码指令让相机拍一张调用ExecuteSoftwareTrigger()不需要接线、不需要外部信号优点控制最灵活想什么时候拍就什么时候拍多相机可以代码级同步适合高精度定时采集50ms、20ms、10ms缺点PC 忙的时候触发精度会掉一点28 个相机一起触发时序会有几毫秒偏差硬件触发Hardware Trigger最稳定、最同步、工业标准方案用IO 线给相机一个 3.3V/5V 脉冲一通电所有相机同时拍照同步精度微秒级优点28 台相机可以做到完全同时曝光不受 CPU 占用、系统延迟影响运动抓拍、高精度同步必用缺点要接线、要 IO 卡、要继电器 / PLC成本高、布线麻烦自由运行 / 连续采集Free Run / Auto相机自己按帧率一直拍25fps、30fps不用触发不用指令优点最简单不用管缺点多相机完全不同步信号触发IO 信号、编码器、光耦属于硬件触发的分支编码器触发走多少距离拍一张光电开关触发有物体过来拍PLC 触发高频单帧取图的陷阱ExecuteSoftwareTrigger与多次调用PhotoImage区别在于 ExecuteSoftwareTrigger流启动后无需触发可以根据指令触发拍照但是PhotoImage每次都会走全流程创建流-推缓冲区-启动采集-取帧-释放流仅适用于偶尔手动拍一张如调试、预览代码刨析首先是触发方式是根据官方给的APIarv_camera_set_string决定的在动态库中添加两个函数开启软件触发前台调用m_nErrCode m_cam-SetSoftwareTrigger(true, m_szErrMsg);m_cam-SetTriggerSelector(FrameStart);我没有写因为默认开启就是帧触发m_cam-OpenStream();启动流COMMON_ERR CDevice::SetSoftwareTrigger(bool enable, char* szMsg/* NULL*/) { //校验相机是否有效m_pGige不为空 if (Invalidate()) return ERR_CAMERA_INVALID; GError* error NULL; ArvCamera* camera (ArvCamera*)m_pGige; COMMON_ERR nErrCode COMMON_OK; // 设置 TriggerMode arv_camera_set_string(camera, TriggerMode, enable ? On : Off, error); if (error) { nErrCode error-code; if (szMsg) memcpy(szMsg, error-message, sizeof(tagErrMsg) - 1); g_clear_error(error); return nErrCode; } // 开启时设置 TriggerSource Software if (enable) { arv_camera_set_string(camera, TriggerSource, Software, error); if (error) { nErrCode error-code; if (szMsg) memcpy(szMsg, error-message, sizeof(tagErrMsg) - 1); g_clear_error(error); // 可选回滚 arv_camera_set_string(camera, TriggerMode, Off, nullptr); return nErrCode; } } return COMMON_OK; }在程序中调用m_nErrCode m_cam-ExecuteSoftwareTrigger(m_szErrMsg);// 执行软件触发 COMMON_ERR CDevice::ExecuteSoftwareTrigger(char* szMsg/* NULL*/) { // 1. 校验相机是否有效m_pGige不为空 if (Invalidate()) return ERR_CAMERA_INVALID; GError* error NULL; ArvCamera* camera (ArvCamera*)m_pGige; // 2. 核心调用向相机发送软件触发指令 arv_camera_software_trigger(camera, error); COMMON_ERR nErrCode COMMON_OK; if (error) { nErrCode error-code; if (szMsg) memcpy(szMsg, error-message, sizeof(tagErrMsg) - 1); g_clear_error(error); } return nErrCode; }之后相机会自己拍照我们只需要读他拍照后反馈的流就可以相比COMMON_ERR CGige::PhotoImage(char* szMsg/* NULL*/)中COMMON_ERR CGige::PhotoImage(char* szMsg/* NULL*/) { if (Invalidate()) return ERR_CAMERA_INVALID; COMMON_ERR nErrCode COMMON_OK; GError* error NULL; ArvCamera* camera (ArvCamera*)m_pGige; int bits GetBitCount(); m_nBitCount (bits 24) ? bits : 8; int width arv_camera_get_integer(camera, Width, NULL); int height arv_camera_get_integer(camera, Height, NULL); arv_camera_gv_select_stream_channel(camera, 0, NULL); arv_camera_set_acquisition_mode(camera, ARV_ACQUISITION_MODE_SINGLE_FRAME, NULL); guint payload arv_camera_get_payload(camera, NULL); ArvStream* stream arv_camera_create_stream(camera, NULL, NULL, error); if (stream payload 0) { for (int i 0; i 1; i) arv_stream_push_buffer(stream, arv_buffer_new(payload, NULL)); InitRateSpeed(); arv_camera_start_acquisition(camera, error); if (!error) { ArvBuffer* buffer arv_stream_pop_buffer(stream); if (buffer arv_buffer_get_status(buffer) ARV_BUFFER_STATUS_SUCCESS) { size_t buffer_size 0; const uint8_t* data reinterpret_castconst uint8_t*(arv_buffer_get_data(buffer, buffer_size)); int nWidth arv_buffer_get_image_width(buffer); int nHeight arv_buffer_get_image_height(buffer); SaveBuffer(data, buffer_size, nWidth, nHeight); } if (buffer) g_clear_object(buffer); } arv_camera_stop_acquisition(camera, NULL); } if (error) { nErrCode error-code; //ERR_CREATE_STREAM; if (szMsg) memcpy(szMsg, error-message, sizeof(tagErrMsg) - 1); g_clear_error(error); } if (stream) g_clear_object(stream); return nErrCode; }每次都会创建新的流要节省大多时间

相关新闻