Windows example: This example shows the usage of the external reference probe BR 20AR.
Windows example: This example shows the usage of the external reference probe BR 20AR.
#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
#include <fstream>
#include "IRDevice.h"
#include "IRImager.h"
#include "IRLogger.h"
#include "ImageBuilder.h"
#include "VideoDisplay.h"
VideoDisplay* _display;
unsigned char* _thermalImage;
unsigned int _measurementFieldTopLeftU = 10;
unsigned int _measurementFieldTopLeftV = 10;
unsigned int _measurementFieldWidth = 100;
unsigned int _measurementFieldHeight = 100;
unsigned int _lastReferenceCounterHW = 0;
float _tempAvgProbe = 0;
float _tempAvgMeasurementField = 0;
char _measurementsCount = 0;
void __CALLCONV onRawFrame(unsigned char* data, int len, evo::IRDevice* dev)
{
unsigned long serial = dev->getSerial();
}
void __CALLCONV onThermalFrame(
unsigned short* thermal,
unsigned int w,
unsigned int h,
evo::IRFrameMetadata meta,
void* arg)
{
evo::IRDevice* device = (evo::IRDevice*)arg;
unsigned long serial = device->getSerial();
std::cout <<
"Frameid: " << meta.
counter << std::endl;
{
std::cout << "Please enable external probe through setting IRDeviceParams::useExternalProbeForReferencing to true!" << std::endl;
return;
}
float tempExternalProbe = meta.
pifAIs[0];
if (tempExternalProbe > 511)
{
std::cout << "Check connection to external probe!" << std::endl;
return;
}
iBuilder.setPaletteScalingMethod(evo::eMinMax);
iBuilder.setPalette(evo::eIron);
iBuilder.setData(w, h, thermal);
if (_thermalImage == NULL)
_thermalImage = new unsigned char[iBuilder.getStride() * h * 3];
unsigned char* thermalImage = _thermalImage;
iBuilder.convertTemperatureToPaletteImage(thermalImage);
for (size_t u = _measurementFieldTopLeftU; u < (_measurementFieldTopLeftU + _measurementFieldWidth); u++)
{
thermalImage[(iBuilder.getStride() * _measurementFieldTopLeftV + u) * 3 + 2] = 255;
thermalImage[(iBuilder.getStride() * (_measurementFieldTopLeftV + _measurementFieldHeight) + u) * 3 + 2] = 255;
}
for (size_t v = _measurementFieldTopLeftV + 1; v < (_measurementFieldTopLeftV + _measurementFieldHeight); v++)
{
thermalImage[((iBuilder.getStride() * v) + _measurementFieldTopLeftU) * 3 + 2] = 255;
thermalImage[((iBuilder.getStride() * v) + _measurementFieldTopLeftU + _measurementFieldWidth) * 3 + 2] = 255;
}
_display->drawCapture(0, 0, iBuilder.getStride(), h, 24, thermalImage);
_tempAvgProbe = (_tempAvgProbe * 4 + tempExternalProbe) / 5.f;
std::cout << "Reference Temperature of external Probe: " << tempExternalProbe << " �C" << std::endl;
if (meta.
flagState == 0 && thermal[0] > 0 && thermal[0] != 0xcdcd)
{
if (_measurementsCount < 5)
_measurementsCount++;
float meanTempMeasurementField = iBuilder.getMeanTemperature(
_measurementFieldTopLeftU
, _measurementFieldTopLeftV
, _measurementFieldTopLeftU + _measurementFieldWidth
, _measurementFieldTopLeftV + _measurementFieldHeight);
_tempAvgMeasurementField = (std::abs(_tempAvgMeasurementField - meanTempMeasurementField) < 0.5f) ? ((_tempAvgMeasurementField * 4 + meanTempMeasurementField) / 5.f) : meanTempMeasurementField;
std::cout << "Camera avg. Temperature of external probe: " << _tempAvgMeasurementField << std::endl;
float tempDiff = std::abs(_tempAvgMeasurementField - _tempAvgProbe);
long long diffTime = avgTimePerFrame * ((
long int)meta.
counterHW - _lastReferenceCounterHW);
const long long waitInterval = 500 * 1000 * 10;
if (_measurementsCount > 4 && (diffTime < 0 || diffTime > waitInterval) && tempDiff >= ((_imager->
getTemprangeDecimal() <= 1) ? 0.2f : 0.04f))
{
std::cout << "Call of setReferenceTemperature: " << tempDiff << " " << _tempAvgProbe << " " << _tempAvgMeasurementField << std::endl;
}
}
}
int main(int argc, char* argv[])
{
std::string filename = "";
if (argc < 2)
{
std::cout << "usage: " << argv[0] << " <path to xml file>" << std::endl;
return -1;
}
char* args = argv[1];
size_t argSize = strlen(args) + 1, converted;
wchar_t* argPath = new wchar_t[argSize];
mbstowcs_s(&converted, argPath, argSize, args, argSize);
return -1;
delete[] argPath;
evo::IRDevice* device = evo::IRDevice::IRCreateDevice(params);
if (device)
{
unsigned long serial = device->getSerial();
_display = NULL;
_thermalImage = NULL;
bool run = true;
if (_imager->
init(¶ms, device->getFrequency(), device->getWidth(), device->getHeight(),
true))
{
device->setRawFrameCallback(onRawFrame);
int r = device->startStreaming();
if (r < 0)
{
run = false;
std::cerr << "Error on start streaming on " << serial << std::endl;
}
if (w < 120) w *= 2;
if (h < 120) h *= 2;
_display = new VideoDisplay(w, h);
_display->showDetach();
}
unsigned int bufferSize = device->getRawBufferSize();
unsigned char* bufferRaw = new unsigned char[bufferSize];
while (run)
{
evo::IRDeviceError result = device->getFrame(bufferRaw);
if (result == evo::IRIMAGER_DISCONNECTED)
{
run = false;
}
}
}
else
{
std::cout << "IR Imager device(s) could not be found" << std::endl;
}
device->stopStreaming();
delete device;
delete _imager;
if (_thermalImage) delete _thermalImage;
if (_display) delete _display;
return 0;
}
std::size_t size() const
Returns size of array.
Definition: IRArray.h:184
static bool readXML(const Tchar *xmlFile, IRDeviceParams ¶ms)
Static xml parsing method.
Wrapper for PI driver and image processing library.
Definition: IRImager.h:141
short getTemprangeDecimal() const
Returns the number of decimal places in thermal data.
bool init(IRDeviceParams *params, unsigned int frequency, unsigned int width, unsigned int height, bool useHID, unsigned short hwRev=0, unsigned short fwRev=0)
Initializing routine, to be called after instantiation.
void setThermalFrameCallback(fptrIRThermalFrame callback)
Set callback function to be called for new frames.
unsigned int getHeight() const
Get image height of thermal channel.
void setRadiationParameters(float emissivity, float transmissivity, float tAmbient=-999.f)
Set radiation properties, i.e.
void process(unsigned char *buffer, void *arg=NULL)
Process raw data.
void setReferenceTemperature(float referenceTemperature, float measuredTemperature, float tAmbient=-999.f)
Set a reference temperature to a known reference source inside the view of the camera to improve came...
long long getAvgTimePerFrame() const
Get average time per frame.
unsigned int getWidth() const
Get image width of thermal channel.
static void setVerbosity(IRLoggerVerbosityLevel levelStdout, IRLoggerVerbosityLevel levelFile, const char *filename=NULL)
Change verbosity level.
Image creation module for displaying purposes.
Definition: ImageBuilder.h:66
Structure containing device parameters.
Definition: IRDeviceParams.h:125
bool useExternalProbeForReferencing
Definition: IRDeviceParams.h:148