Compare commits

...

4 Commits

Author SHA1 Message Date
47150d809c 输出版本号:21 2023-07-04 21:20:43 +08:00
1ec5ed879a 补充:更改bin方式为平均模式 2023-06-27 11:34:59 +08:00
81e8f4a169 更改bin方式为平均模式 2023-06-26 19:00:48 +08:00
3df67d7e57 1. 添加功能:setBufferPolicy、setAcqBufferSize(单位MiB);
2. XI_PRM_ACQ_TRANSPORT_BUFFER_SIZE,usb缓存设置;
2023-06-26 15:59:26 +08:00
2 changed files with 109 additions and 22 deletions

View File

@ -34,6 +34,9 @@ namespace Iris
XI_IMG m_image; // image buffer XI_IMG m_image; // image buffer
void setBufferPolicy(int bufferPolicy);//0:XI_BP_UNSAFE; 1:XI_BP_SAFE;
void setAcqBufferSize(int acqBufferSize);//单位MiB
public: public:
//继承基类的 //继承基类的
IrisXimeaImager();//11111111111111111111 IrisXimeaImager();//11111111111111111111

View File

@ -9,13 +9,14 @@ void Iris::IrisXimeaImager::setGainOffset(float gain, float offset)
bool Iris::IrisXimeaImager::setSpectralBin(int spectralBin) 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_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_MODE, XI_BIN_MODE_AVERAGE));
// CE(xiSetParamInt(m_xiH, XI_PRM_BINNING_VERTICAL, spectralBin));//*********************************** CE(xiSetParamInt(m_xiH, XI_PRM_BINNING_VERTICAL, spectralBin));
printf("Iris::IrisXimeaImager::setSpectralBin----2 设置bin模式为XI_PRM_BINNING_SELECTOR XI_BIN_MODE_AVERAGE \n");
CE(xiSetParamInt(m_xiH, XI_PRM_DECIMATION_SELECTOR, XI_DEC_SELECT_SENSOR)); // CE(xiSetParamInt(m_xiH, XI_PRM_DECIMATION_SELECTOR, XI_DEC_SELECT_SENSOR));
CE(xiSetParamInt(m_xiH, XI_PRM_DECIMATION_VERTICAL, spectralBin)); // CE(xiSetParamInt(m_xiH, XI_PRM_DECIMATION_VERTICAL, spectralBin));
m_iSpectralBin = spectralBin; m_iSpectralBin = spectralBin;
@ -25,14 +26,14 @@ bool Iris::IrisXimeaImager::setSpectralBin(int spectralBin)
bool Iris::IrisXimeaImager::setSpatialBin(int spatialBin) 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_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_AVERAGE));
// 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_BINNING_HORIZONTAL, spatialBin)); printf("Iris::IrisXimeaImager::setSpatialBin----2 设置bin模式为XI_PRM_BINNING_SELECTOR XI_BIN_MODE_AVERAGE \n");
CE(xiSetParamInt(m_xiH, XI_PRM_DECIMATION_SELECTOR, XI_DEC_SELECT_SENSOR)); // CE(xiSetParamInt(m_xiH, XI_PRM_DECIMATION_SELECTOR, XI_DEC_SELECT_SENSOR));
CE(xiSetParamInt(m_xiH, XI_PRM_DECIMATION_HORIZONTAL, spatialBin)); // CE(xiSetParamInt(m_xiH, XI_PRM_DECIMATION_HORIZONTAL, spatialBin));
m_iSpatialBin = spatialBin; m_iSpatialBin = spatialBin;
@ -42,9 +43,9 @@ bool Iris::IrisXimeaImager::setSpatialBin(int spatialBin)
int Iris::IrisXimeaImager::getSpectralBin() int Iris::IrisXimeaImager::getSpectralBin()
{ {
int spectralBin = 0; int spectralBin = 0;
// CE(xiGetParamInt(m_xiH, XI_PRM_BINNING_VERTICAL, &spectralBin)); CE(xiGetParamInt(m_xiH, XI_PRM_BINNING_VERTICAL, &spectralBin));
CE(xiGetParamInt(m_xiH, XI_PRM_DECIMATION_VERTICAL, &spectralBin)); // CE(xiGetParamInt(m_xiH, XI_PRM_DECIMATION_VERTICAL, &spectralBin));
return spectralBin; return spectralBin;
} }
@ -52,9 +53,9 @@ int Iris::IrisXimeaImager::getSpectralBin()
int Iris::IrisXimeaImager::getSpatialBin() int Iris::IrisXimeaImager::getSpatialBin()
{ {
int spatialBin = 0; int spatialBin = 0;
// CE(xiGetParamInt(m_xiH, XI_PRM_BINNING_HORIZONTAL, &spatialBin)); CE(xiGetParamInt(m_xiH, XI_PRM_BINNING_HORIZONTAL, &spatialBin));
CE(xiGetParamInt(m_xiH, XI_PRM_DECIMATION_HORIZONTAL, &spatialBin)); // CE(xiGetParamInt(m_xiH, XI_PRM_DECIMATION_HORIZONTAL, &spatialBin));
return spatialBin; return spatialBin;
} }
@ -96,6 +97,11 @@ int Iris::IrisXimeaImager::getBufferSizeOfOneFrame()
// //
// return static_cast<int>(m_image.bp_size); // return static_cast<int>(m_image.bp_size);
// //比实际大小m_iEffectiveWindow_height * m_iEffectiveWindow_width * 2why
// int value = 0;
// xiGetParamInt(m_xiH, XI_PRM_IMAGE_PAYLOAD_SIZE, &value);
return m_iEffectiveWindow_height * m_iEffectiveWindow_width * 2; return m_iEffectiveWindow_height * m_iEffectiveWindow_width * 2;
} }
@ -107,9 +113,49 @@ float Iris::IrisXimeaImager::getTemperature()
return temperature; return temperature;
} }
void Iris::IrisXimeaImager::setBufferPolicy(int bufferPolicy)
{
if (bufferPolicy==0)
{
xiSetParamInt(m_xiH, XI_PRM_BUFFER_POLICY, XI_BP_UNSAFE);
printf("Iris::IrisXimeaImager::connect---- XI_PRM_BUFFER_POLICY: XI_BP_UNSAFE\n");
}
else if (bufferPolicy==1)
{
xiSetParamInt(m_xiH, XI_PRM_BUFFER_POLICY, XI_BP_SAFE);
printf("Iris::IrisXimeaImager::connect---- XI_PRM_BUFFER_POLICY: XI_BP_SAFE\n");
}
}
void Iris::IrisXimeaImager::setAcqBufferSize(int acqBufferSize)
{
XI_RETURN stat = XI_OK;
// set unit to 1 MiB
xiSetParamInt(m_xiH, XI_PRM_ACQ_BUFFER_SIZE_UNIT, 1024*1024);
int value = 0;
xiGetParamInt(m_xiH, XI_PRM_ACQ_BUFFER_SIZE, &value);
printf("Iris::IrisXimeaImager::connect---- XI_PRM_ACQ_BUFFER_SIZE: %d MiB.\n", value);
xiSetParamInt(m_xiH, XI_PRM_ACQ_BUFFER_SIZE, acqBufferSize);
xiGetParamInt(m_xiH, XI_PRM_ACQ_BUFFER_SIZE, &value);
printf("Iris::IrisXimeaImager::connect---- XI_PRM_ACQ_BUFFER_SIZE: %d MiB.\n", value);
// set maximum number of queue
int number_of_field_buffers = 0;
xiGetParamInt(m_xiH, XI_PRM_BUFFERS_QUEUE_SIZE XI_PRM_INFO_MAX, &number_of_field_buffers);
printf("Iris::IrisXimeaImager::connect---- XI_PRM_BUFFERS_QUEUE_SIZE XI_PRM_INFO_MAX: %d.\n", number_of_field_buffers);
HandleResult(stat,"xiGetParam (number_of_field_buffers maximum)");
xiSetParamInt(m_xiH, XI_PRM_BUFFERS_QUEUE_SIZE, number_of_field_buffers);
HandleResult(stat,"xiSetParam (number_of_field_buffers)");
}
Iris::IrisXimeaImager::IrisXimeaImager() Iris::IrisXimeaImager::IrisXimeaImager()
{ {
m_xiH=NULL; m_xiH=NULL;
std::cout<<"ximeaControlDll 版本:"<< "21." <<std::endl;
} }
Iris::IrisXimeaImager::~IrisXimeaImager() Iris::IrisXimeaImager::~IrisXimeaImager()
@ -122,6 +168,51 @@ void Iris::IrisXimeaImager::connect(const char *camera_serial_number)
printf("Iris::IrisXimeaImager::connect----1 打开相机(xiOpenDevice)\n"); printf("Iris::IrisXimeaImager::connect----1 打开相机(xiOpenDevice)\n");
CE(xiOpenDevice(0, &m_xiH));//没有插上ximea相机,这句代码都过不去 CE(xiOpenDevice(0, &m_xiH));//没有插上ximea相机,这句代码都过不去
//add-----------------------------------------------------------------------------------------------------------------------
XI_RETURN stat = XI_OK;
int payload=0;
stat = xiGetParamInt(m_xiH, XI_PRM_IMAGE_PAYLOAD_SIZE, &payload);
HandleResult(stat,"xiGetParam (payload)");
int transport_buffer_size_default = 0;
int transport_buffer_size_increment = 0;
int transport_buffer_size_minimum = 0;
// get default transport buffer size - that should be OK on all controllers
stat = xiGetParamInt(m_xiH, XI_PRM_ACQ_TRANSPORT_BUFFER_SIZE, &transport_buffer_size_default);
HandleResult(stat,"xiGetParamInt (transport buffer size)");
stat = xiGetParamInt(m_xiH, XI_PRM_ACQ_TRANSPORT_BUFFER_SIZE XI_PRM_INFO_INCREMENT, &transport_buffer_size_increment);
HandleResult(stat,"xiGetParamInt (transport buffer size increment)");
stat = xiGetParamInt(m_xiH, XI_PRM_ACQ_TRANSPORT_BUFFER_SIZE XI_PRM_INFO_MIN, &transport_buffer_size_minimum);
HandleResult(stat,"xiGetParamInt (transport buffer size minimum)");
// check if payload size is less than default transport buffer size
if(payload < transport_buffer_size_default + transport_buffer_size_increment)
{
// use optimized transport buffer size, as nearest increment to payload
int transport_buffer_size = payload;
if (transport_buffer_size_increment)
{
// round up to nearest increment
int remainder = transport_buffer_size % transport_buffer_size_increment;
if (remainder)
transport_buffer_size += transport_buffer_size_increment - remainder;
}
// check the minimum
if (transport_buffer_size < transport_buffer_size_minimum)
transport_buffer_size = transport_buffer_size_minimum;
stat = xiSetParamInt(m_xiH, XI_PRM_ACQ_TRANSPORT_BUFFER_SIZE, transport_buffer_size);
HandleResult(stat,"xiSetParam (transport buffer size)");
}
//add---------------------------------------------------------------------------------------------------------------------------------------------------------------
// set unit to 1 MiB
xiSetParamInt(m_xiH, XI_PRM_ACQ_BUFFER_SIZE_UNIT, 1024*1024);
int value = 0;
xiGetParamInt(m_xiH, XI_PRM_ACQ_BUFFER_SIZE, &value);
printf("Iris::IrisXimeaImager::connect---- XI_PRM_ACQ_BUFFER_SIZE: %d MiB.\n", value);
int NUM_THREADS = 0; int NUM_THREADS = 0;
xiGetParamInt(m_xiH, XI_PRM_PROC_NUM_THREADS, &NUM_THREADS); xiGetParamInt(m_xiH, XI_PRM_PROC_NUM_THREADS, &NUM_THREADS);
printf("Iris::IrisXimeaImager::connect---- XI_PRM_PROC_NUM_THREADS默认值为%d\n", NUM_THREADS); printf("Iris::IrisXimeaImager::connect---- XI_PRM_PROC_NUM_THREADS默认值为%d\n", NUM_THREADS);
@ -258,13 +349,6 @@ uint64_t Iris::IrisXimeaImager::ticks_per_second()
void Iris::IrisXimeaImager::set_spectral_bin(int new_spectral_bin) void Iris::IrisXimeaImager::set_spectral_bin(int new_spectral_bin)
{ {
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, new_spectral_bin));
// CE(xiSetParamInt(m_xiH, XI_PRM_BINNING_HORIZONTAL_MODE, XI_BIN_MODE_SUM));
// CE(xiSetParamInt(m_xiH, XI_PRM_BINNING_HORIZONTAL, x));
} }
int Iris::IrisXimeaImager::get_spectral_bin() int Iris::IrisXimeaImager::get_spectral_bin()