Compare commits

...

7 Commits

3 changed files with 122 additions and 34 deletions

View File

@ -13,6 +13,7 @@ set(TARGET irisXimeaImager)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(Qt5 REQUIRED ${QT})
include_directories(/usr/include)
include_directories(/opt/XIMEA/include/)
add_library(
irisXimeaImager SHARED

View File

@ -31,6 +31,12 @@ namespace Iris
void setEffectiveWindowRoi(int OffsetX, int width);
int getBufferSizeOfOneFrame();
float getTemperature();
XI_IMG m_image; // image buffer
void setBufferPolicy(int bufferPolicy);//0:XI_BP_UNSAFE; 1:XI_BP_SAFE;
void setAcqBufferSize(int acqBufferSize);//单位MiB
public:
//继承基类的
IrisXimeaImager();//11111111111111111111
@ -95,7 +101,6 @@ namespace Iris
bool is_trigger_external();
protected:
private:
XI_IMG m_image; // image buffer
uint64_t m_timestampOfCamera;
int m_iSpectralBin;

View File

@ -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 * 2why
// 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()