From 3df67d7e57b217f0ea63084cca0dd0930cf661a4 Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Mon, 26 Jun 2023 15:59:26 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=9AsetBufferPolicy=E3=80=81setAcqBufferSize=EF=BC=88?= =?UTF-8?q?=E5=8D=95=E4=BD=8DMiB=EF=BC=89=EF=BC=9B=202.=20XI=5FPRM=5FACQ?= =?UTF-8?q?=5FTRANSPORT=5FBUFFER=5FSIZE=EF=BC=8Cusb=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Header_Files/irisximeaimager.h | 3 ++ Source_Files/irisximeaimager.cpp | 88 ++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/Header_Files/irisximeaimager.h b/Header_Files/irisximeaimager.h index 041ecf1..8a16685 100644 --- a/Header_Files/irisximeaimager.h +++ b/Header_Files/irisximeaimager.h @@ -34,6 +34,9 @@ namespace Iris 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 diff --git a/Source_Files/irisximeaimager.cpp b/Source_Files/irisximeaimager.cpp index 2f920d9..85d44e8 100644 --- a/Source_Files/irisximeaimager.cpp +++ b/Source_Files/irisximeaimager.cpp @@ -96,6 +96,11 @@ int Iris::IrisXimeaImager::getBufferSizeOfOneFrame() // // return static_cast(m_image.bp_size); +// //比实际大小(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; } @@ -107,6 +112,44 @@ 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; @@ -122,6 +165,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);