#include "Header_Files/irisximeaimager.h" void Iris::IrisXimeaImager::setGainOffset(float gain, float offset) { m_fGain = gain; m_fOffset = offset; } bool Iris::IrisXimeaImager::setSpectralBin(int spectralBin) { CE(xiSetParamInt(m_xiH, XI_PRM_BINNING_SELECTOR, XI_BIN_SELECT_HOST_CPU));//用:XI_BIN_SELECT_HOST_CPU;默认为XI_BIN_SELECT_SENSOR(会报错),不可用:XI_BIN_SELECT_DEVICE_FPGA CE(xiSetParamInt(m_xiH, XI_PRM_BINNING_VERTICAL_MODE, XI_BIN_MODE_SUM)); CE(xiSetParamInt(m_xiH, XI_PRM_BINNING_VERTICAL, spectralBin));//*********************************** return true; } bool Iris::IrisXimeaImager::setSpatialBin(int spatialBin) { CE(xiSetParamInt(m_xiH, XI_PRM_BINNING_SELECTOR, XI_BIN_SELECT_HOST_CPU));//用:XI_BIN_SELECT_HOST_CPU;默认为XI_BIN_SELECT_SENSOR(会报错),不可用:XI_BIN_SELECT_DEVICE_FPGA CE(xiSetParamInt(m_xiH, XI_PRM_BINNING_HORIZONTAL_MODE, XI_BIN_MODE_SUM)); CE(xiSetParamInt(m_xiH, XI_PRM_BINNING_HORIZONTAL, spatialBin)); return true; } int Iris::IrisXimeaImager::getSpectralBin() { int spectralBin = 0; CE(xiGetParamInt(m_xiH, XI_PRM_BINNING_VERTICAL, &spectralBin)); return spectralBin; } int Iris::IrisXimeaImager::getSpatialBin() { int spatialBin = 0; CE(xiGetParamInt(m_xiH, XI_PRM_BINNING_HORIZONTAL, &spatialBin)); return spatialBin; } void Iris::IrisXimeaImager::setRoi(int OffsetX, int width, int OffsetY, int height) { CE(xiSetParamInt(m_xiH, XI_PRM_WIDTH, width)); CE(xiSetParamInt(m_xiH, XI_PRM_OFFSET_X, OffsetX)); CE(xiSetParamInt(m_xiH, XI_PRM_HEIGHT, height)); CE(xiSetParamInt(m_xiH, XI_PRM_OFFSET_Y, OffsetY)); } int Iris::IrisXimeaImager::getBufferSizeOfOneFrame() { if(m_xiH==NULL) return 0; start(); //清空image缓存 memset(&m_image, 0, sizeof(m_image)); m_image.size = sizeof(XI_IMG); CE(xiGetImage(m_xiH, 5000, &m_image)); // getting next image from the camera opened stop(); return static_cast(m_image.bp_size); } float Iris::IrisXimeaImager::getTemperature() { float temperature = 0.0; CE(xiGetParamFloat(m_xiH, XI_PRM_TEMP, &temperature)); return temperature; } Iris::IrisXimeaImager::IrisXimeaImager() { m_xiH=NULL; } Iris::IrisXimeaImager::~IrisXimeaImager() { } void Iris::IrisXimeaImager::connect(const char *camera_serial_number) { printf("Iris::IrisXimeaImager::connect----1 打开相机(xiOpenDevice)\n"); CE(xiOpenDevice(0, &m_xiH));//没有插上ximea相机,这句代码都过不去 //设置数据格式 printf("Iris::IrisXimeaImager::connect----2 设置数据格式(xiSetParamInt)\n"); CE(xiSetParamInt(m_xiH, XI_PRM_IMAGE_DATA_FORMAT, XI_RAW16));//Default value: XI_MONO8 // //设置packing, 使用xiGetImage接收影像时不执行unpacking // CE(xiSetParamInt(m_xiH, XI_PRM_OUTPUT_DATA_BIT_DEPTH, 12));//set 12 bit transport data width // CE(xiSetParamInt(m_xiH, XI_PRM_OUTPUT_DATA_PACKING, XI_ON));//enable packing // //使用xiGetImage接收影像时不执行unpacking // CE(xiSetParamInt(m_xiH, XI_PRM_IMAGE_DATA_FORMAT, XI_FRM_TRANSPORT_DATA));//in this case, the function xiGetImage just set pointer to transport-buffer without any processing //判断数据格式设置是否成功 int dataFortmat; CE(xiGetParamInt(m_xiH, XI_PRM_IMAGE_DATA_FORMAT, &dataFortmat)); if(dataFortmat==XI_RAW16) { printf("Iris::IrisXimeaImager::connect----当前数据格式设置成功, 设置为: XI_RAW16\n"); } else if(dataFortmat==XI_FRM_TRANSPORT_DATA) { printf("Iris::IrisXimeaImager::connect----当前数据格式设置成功, 设置为: XI_FRM_TRANSPORT_DATA\n"); } else { printf("Iris::IrisXimeaImager::connect----2 数据格式设置失败!\n"); printf("Iris::IrisXimeaImager::connect----当前数据格式为:%d\n",dataFortmat); } } void Iris::IrisXimeaImager::disconnect() { printf("Closing camera...\n"); CE(xiCloseDevice(m_xiH)); } void Iris::IrisXimeaImager::start() { CE(xiStartAcquisition(m_xiH)); } void Iris::IrisXimeaImager::stop() { //printf("Stopping acquisition...\n"); CE(xiStopAcquisition(m_xiH)); } void Iris::IrisXimeaImager::get_imager_type(char *buffer, int buffer_size) { } void Iris::IrisXimeaImager::get_serial_number(char *buffer, int buffer_size) { } void Iris::IrisXimeaImager::get_camera_serial_number(char *buffer, int buffer_size) { } void Iris::IrisXimeaImager::generate_configuration_report(char *buffer, int buffer_size) { } float Iris::IrisXimeaImager::get_coeff_a() { return 0; } float Iris::IrisXimeaImager::get_coeff_b() { return 0; } float Iris::IrisXimeaImager::get_coeff_c() { return 0; } double Iris::IrisXimeaImager::get_wavelength_at_band(const int band) { //sn008 float a=1.999564; float b=-279.893; // float wavelength=band*m_fGain + m_fOffset; return wavelength; } int Iris::IrisXimeaImager::get_frame_buffer_size_in_bytes() { return 0; } unsigned short *Iris::IrisXimeaImager::get_frame(unsigned short *buffer) { //清空image缓存 memset(&m_image, 0, sizeof(m_image)); m_image.size = sizeof(XI_IMG); // //Reads the current timestamp value from camera in nanoseconds. // m_timestampOfCamera=0; // DWORD size=sizeof(m_timestampOfCamera); // XI_PRM_TYPE type=xiTypeInteger64; // xiGetParam(m_xiH, XI_PRM_TIMESTAMP,&m_timestampOfCamera,&size,&type); CE(xiGetImage(m_xiH, 5000, &m_image)); // getting next image from the camera opened // int buffer_policy=0;// // xiGetParamInt(m_xiH, XI_PRM_BUFFER_POLICY,&buffer_policy); //// XI_BP_UNSAFE =0, // User gets pointer to internally allocated circle buffer and data may be overwritten by device. //// XI_BP_SAFE =1, // Data from device will be copied to user allocated buffer or xiApi allocated memory. // // // int b1=m_image.width*m_image.height*2; // int b2=m_image.size;//结构体XI_IMG的大小 int b3=m_image.bp_size;//一般b1==b3 // int b4=0; // xiGetParamInt(m_xiH, XI_PRM_IMAGE_PAYLOAD_SIZE,&b4); // std::cout<<"b1="<