#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));//*********************************** CE(xiSetParamInt(m_xiH, XI_PRM_DECIMATION_SELECTOR, XI_DEC_SELECT_SENSOR)); CE(xiSetParamInt(m_xiH, XI_PRM_DECIMATION_VERTICAL, spectralBin)); m_iSpectralBin = 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)); CE(xiSetParamInt(m_xiH, XI_PRM_DECIMATION_SELECTOR, XI_DEC_SELECT_SENSOR)); CE(xiSetParamInt(m_xiH, XI_PRM_DECIMATION_HORIZONTAL, spatialBin)); m_iSpatialBin = spatialBin; return true; } int Iris::IrisXimeaImager::getSpectralBin() { int spectralBin = 0; // CE(xiGetParamInt(m_xiH, XI_PRM_BINNING_VERTICAL, &spectralBin)); CE(xiGetParamInt(m_xiH, XI_PRM_DECIMATION_VERTICAL, &spectralBin)); return spectralBin; } int Iris::IrisXimeaImager::getSpatialBin() { int spatialBin = 0; // CE(xiGetParamInt(m_xiH, XI_PRM_BINNING_HORIZONTAL, &spatialBin)); CE(xiGetParamInt(m_xiH, XI_PRM_DECIMATION_HORIZONTAL, &spatialBin)); return spatialBin; } void Iris::IrisXimeaImager::setEffectiveWindow(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)); m_iEffectiveWindow_OffsetX = OffsetX; m_iEffectiveWindow_width = width; m_iEffectiveWindow_OffsetY = OffsetY; m_iEffectiveWindow_height = height; } void Iris::IrisXimeaImager::setEffectiveWindowRoi(int OffsetX, int width) { m_iEffectiveWindowRoi_OffsetX = OffsetX; m_iEffectiveWindowRoi_width = width; } 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); return m_iEffectiveWindow_height * m_iEffectiveWindowRoi_width * 2; } 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相机,这句代码都过不去 int NUM_THREADS = 0; xiGetParamInt(m_xiH, XI_PRM_PROC_NUM_THREADS, &NUM_THREADS); printf("Iris::IrisXimeaImager::connect---- XI_PRM_PROC_NUM_THREADS默认值为%d\n", NUM_THREADS); xiSetParamInt(m_xiH, XI_PRM_PROC_NUM_THREADS, 8); //设置数据格式 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)); m_xiH=NULL; } 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); CE(xiGetImage(m_xiH, 5000, &m_image)); // getting next image from the camera opened //方法1:memcpy // memcpy(buffer,m_image.bp,m_image.bp_size); // //方法2:此做法是错误的,虽然是指针,也是传值! // buffer = (unsigned short *)m_image.bp; for(int i=0;i