@ -1,4 +1,5 @@
# include "Header_Files/irisximeaimager.h"
using namespace Iris ;
void Iris : : IrisXimeaImager : : setGainOffset ( float gain , float offset )
{
@ -9,9 +10,14 @@ void Iris::IrisXimeaImager::setGainOffset(float gain, float 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_AVERAGE ) ) ;
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_VERTICAL, spectralBin));
CE ( xiSetParamInt ( m_xiH , XI_PRM_BINNING_VERTICAL_MODE , XI_BIN_MODE_SUM ) ) ;
CE ( xiSetParamInt ( m_xiH , XI_PRM_BINNING_VERTICAL , spectralBin ) ) ; //***********************************
m_iSpectralBin = spectralBin ;
@ -21,9 +27,13 @@ bool Iris::IrisXimeaImager::setSpectralBin(int spectralBin)
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_MODE , XI_BIN_MODE_AVERAGE ) ) ;
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_HORIZONTAL, spatialBin));
m_iSpatialBin = spatialBin ;
@ -35,6 +45,8 @@ 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 ;
}
@ -43,6 +55,8 @@ 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 ;
}
@ -83,17 +97,12 @@ int Iris::IrisXimeaImager::getBufferSizeOfOneFrame()
//
// return static_cast<int>(m_image.bp_size);
if ( m_iSpectralBin = = 1 )
{
return m_iEffectiveWindow_height * 1364 * 2 ;
}
else if ( m_iSpectralBin = = 2 )
{
return m_iEffectiveWindow_height * 682 * 2 ;
}
// //比实际大小( m_iEffectiveWindow_height * m_iEffectiveWindow_width * 2) 大, why?
// int value = 0;
// xiGetParamInt(m_xiH, XI_PRM_IMAGE_PAYLOAD_SIZE, &value);
return m_iEffectiveWindow_height * m_iEffectiveWindow_width * 2 ;
}
float Iris : : IrisXimeaImager : : getTemperature ( )
@ -104,9 +113,49 @@ float Iris::IrisXimeaImager::getTemperature()
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 ( )
{
m_xiH = NULL ;
std : : cout < < " ximeaControlDll 版本: " < < " 21. " < < std : : endl ;
}
Iris : : IrisXimeaImager : : ~ IrisXimeaImager ( )
@ -119,6 +168,51 @@ void Iris::IrisXimeaImager::connect(const char *camera_serial_number)
printf ( " Iris::IrisXimeaImager::connect----1 打开相机(xiOpenDevice) \n " ) ;
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 ;
xiGetParamInt ( m_xiH , XI_PRM_PROC_NUM_THREADS , & NUM_THREADS ) ;
printf ( " Iris::IrisXimeaImager::connect---- XI_PRM_PROC_NUM_THREADS默认值为%d \n " , NUM_THREADS ) ;
@ -149,13 +243,15 @@ void Iris::IrisXimeaImager::connect(const char *camera_serial_number)
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 ( )
@ -232,10 +328,10 @@ unsigned short *Iris::IrisXimeaImager::get_frame(unsigned short *buffer)
// //方法2:此做法是错误的,虽然是指针,也是传值!
// buffer = (unsigned short *)m_image.bp;
for( int i = 0 ; i < m_iEffectiveWindow_height; i + + )
{
memcpy( buffer+ i * m_iEffectiveWindowRoi_width, ( unsigned short * ) m_image . bp + i * m_iEffectiveWindow_width + m_iEffectiveWindowRoi_OffsetX, m_iEffectiveWindowRoi_width* 2 ) ;
}
// for(int i=0;i< m_iEffectiveWindow_height;i++)
// {
// memcpy( buffer+i* m_iEffectiveWindowRoi_width, ( unsigned short *)m_image.bp + i* m_iEffectiveWindow_width + m_iEffectiveWindowRoi_OffsetX, m_iEffectiveWindowRoi_width*2);
// }
//强制将指针从高精度( uint64_t*) 转换到低精度( unsigned short *),会有精度降低的问题???????????????????????????????????????????????????
return ( unsigned short * ) & m_timestampOfCamera ;
@ -253,13 +349,6 @@ uint64_t Iris::IrisXimeaImager::ticks_per_second()
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 ( )
@ -339,14 +428,7 @@ int Iris::IrisXimeaImager::get_inc_end_band()
int Iris : : IrisXimeaImager : : get_sample_count ( )
{
if ( m_iSpectralBin = = 1 )
{
return 1364 ;
}
else if ( m_iSpectralBin = = 2 )
{
return 682 ;
}
return m_iEffectiveWindow_width ;
}
int Iris : : IrisXimeaImager : : get_start_sample ( )