大恒水星相机触发测试

````

#include <iostream>

#include <string>

#include <vector>

#include <thread>

#include "time.h"

#include "opencv2/opencv.hpp"

#include "../libFSM/include/StateMachine.h"

#include "stdio.h"

#include "GxIAPI.h"

 

//定义全局变量,用来存图和计时

cv::Mat empty(1024, 1280, CV_8UC3, cv::Scalar::all(0));

timeval tv;

long time_end;

long time_start;

//图 像 回 调 处 理 函 数

//传回来的GX_FRAME_CALLBACK_PARAM *pFrame包含了图像所在指针,大小,长度等一系列信息,需要解码之后变成RGB图片

static void GX_STDC OnFrameCallbackFun(GX_FRAME_CALLBACK_PARAM *pFrame)

{

   if (pFrame->status == 0)

   {

      gettimeofday(&tv, NULL);

      time_end = tv.tv_sec * 1000000 + tv.tv_usec;

      std::cout << 1000000 / (time_end - time_start) << "fps"

                << "get an image" << std::endl;

      time_start = time_end;

      void *rgb_buffer = malloc(3 * pFrame->nImgSize);

      DxRaw8toRGB24((void *)pFrame->pImgBuf, rgb_buffer, pFrame->nWidth, pFrame->nHeight, RAW2RGB_NEIGHBOUR, BAYERRG, false);

      cv::Mat result = cv::Mat(pFrame->nHeight, pFrame->nWidth, CV_8UC3, rgb_buffer);

      result.copyTo(empty);

   }

   else

   {

      std::cout << "fuck,trigger is failed" << std::endl;

   }

   return;

}

 

//打开设备和打开库方式相同,关键在于设置触发

int main(int argc, char *argv[])

{

   GX_STATUS status = GX_STATUS_SUCCESS;

   GX_DEV_HANDLE hDevice = NULL;

   GX_OPEN_PARAM stOpenParam;

   uint32_t nDeviceNum = 0;

   gettimeofday(&tv, NULL);

   time_end = tv.tv_sec * 1000000 + tv.tv_usec;

   time_start = tv.tv_sec * 1000000 + tv.tv_usec;

   //初 始 化 库

   status = GXInitLib();

   //枚 举 设 备 列 表

   status = GXUpdateDeviceList(&nDeviceNum, 1000);

   if ((status != GX_STATUS_SUCCESS) || (nDeviceNum <= 0))

   {

      return 0;

   }

   //打 开 设 备

   stOpenParam.accessMode = GX_ACCESS_EXCLUSIVE;

   stOpenParam.openMode = GX_OPEN_INDEX;

   stOpenParam.pszContent = "1";

   status = GXOpenDevice(&stOpenParam, &hDevice);

   if (status == GX_STATUS_SUCCESS)

   {

      //设 置 触 发 模 式 为 ON

      status = GXSetEnum(hDevice, GX_ENUM_TRIGGER_MODE, GX_TRIGGER_MODE_ON);

      //设 置 触 发 激 活 方 式 为 上 升 沿,还可以设置下降沿触发,指电平上升或下降时为一次触发

      status = GXSetEnum(hDevice, GX_ENUM_TRIGGER_ACTIVATION, GX_TRIGGER_ACTIVATION_RISINGEDGE);

      //设置触发开关为line2

      status = GXSetEnum(hDevice, GX_ENUM_TRIGGER_SOURCE, GX_TRIGGER_SOURCE_LINE2);

      //Selects the physical line (or pin) of the external device connector to configure,我也不知道是啥反正加去了

      status = GXSetEnum(hDevice, GX_ENUM_LINE_SELECTOR, GX_ENUM_LINE_SELECTOR_LINE2);

      //设置line2模式为input,同样可以设置为outpot,则可以通过相机控制外部设备

      status = GXSetEnum(hDevice, GX_ENUM_LINE_MODE, GX_ENUM_LINE_MODE_INPUT);

      // GX_ENUM_TRIGGER_MODE: 触发模式, 枚举值参考 GX_TRIGGER_MODE_ENTRY 

      // GX_COMMAND_TRIGGER_SOFTWARE : 软触发命令 

      // GX_ENUM_TRIGGER_ACTIVATION : 触发极性, 枚举值参考 

      // GX_TRIGGER_ACTIVATION_ENTRY GX_ENUM_TRIGGER_SWITCH : 外触发开关, 参考 

      // GX_TRIGGER_SWITCH_ENTRY GX_ENUM_TRIGGER_SOURCE : 触发源, 枚举值参考 

      // GX_TRIGGER_SOURCE_ENTRY GX_ENUM_TRIGGER_SELECTOR : 触发类型选择, 参考 

      // GX_TRIGGER_SELECTOR_ENTRY GX_FLOAT_TRIGGER_DELAY : 触发延迟

      //设置曝光和增益等参数和原先在一致

      status = GXSetFloat(hDevice, GX_FLOAT_EXPOSURE_TIME, (float)3000);

      status = GXSetEnum(hDevice, GX_ENUM_BALANCE_RATIO_SELECTOR, GX_BALANCE_RATIO_SELECTOR_RED);

      status = GXSetFloat(hDevice, GX_FLOAT_BALANCE_RATIO, 1.6484);

      status = GXSetEnum(hDevice, GX_ENUM_BALANCE_RATIO_SELECTOR, GX_BALANCE_RATIO_SELECTOR_BLUE);

      status = GXSetFloat(hDevice, GX_FLOAT_BALANCE_RATIO, 1.5664);

      status = GXSetEnum(hDevice, GX_ENUM_BALANCE_RATIO_SELECTOR, GX_BALANCE_RATIO_SELECTOR_GREEN);

      status = GXSetFloat(hDevice, GX_FLOAT_BALANCE_RATIO, 1.000);

      status = GXSetEnum(hDevice, GX_ENUM_GAIN_SELECTOR, GX_GAIN_SELECTOR_ALL);

      status = GXSetFloat(hDevice, GX_FLOAT_GAIN, 10.0);

   //注 册 图 像 处 理 回 调 函 数,每次接受到一个电平变化就会回调

      status = GXRegisterCaptureCallback(hDevice, NULL, OnFrameCallbackFun);   

      //发 送 开 采 命 令

      status = GXSendCommand(hDevice, GX_COMMAND_ACQUISITION_START);

   }

    //所有引脚状态

   int64_t nAllLineStatus = 0; 

   while (1)

   {

      cv::imshow("test", empty);

      if (cv::waitKey(1) == 'a')

      {

      }

      if (cv::waitKey(1) == 'b')

      {

         //输出所有引脚的电平,0xc默认是未触发状态,但是实际上0xe是未触发

         GX_STATUS Status = GXGetInt(hDevice, GX_INT_LINE_STATUS_ALL, &nAllLineStatus);

         std::cout

             << "line status:" << nAllLineStatus << std::endl; 

      }

      if (cv::waitKey(1) == 'q')

      {

         //

         //在 发 送 停 采 命 令 前 如 果 产 生 了 有 效 触 发 , 那 么 图 像

         //会 通 过 OnFrameCallbackFun 接 口 返 给 用 户

         //---------------------

         //发 送 停 采 命 令

         status = GXSendCommand(hDevice, GX_COMMAND_ACQUISITION_STOP);

         //注 销 采 集 回 调

         status = GXUnregisterCaptureCallback(hDevice);

         status = GXCloseDevice(hDevice);

         hDevice = NULL;

         status = GXCloseLib();

         std::cout << "end captrue" << std::endl;

         return 0;

      }

   }

}

 

 

 

 

Cppyright@2024 HarmonLTS all rights

 

版权所有©HarmonLTS

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值