One of the ther­mal imagers I have been con­sid­er­ing using is the Seek Ther­mal cam­era. An impres­sive cam­era, cur­rent­ly only avail­able in the US, they use a Raytheon sen­sor to cre­ate a small USB cam­era designed to be used with a mobile phone. Most impor­tant­ly for me it sup­ports a wide range of tem­per­a­ture, an inten­tion­al lim­i­ta­tion with the FLIR cores.

Sad­ly the cam­era has some issues. All ther­mal sen­sors require post-pro­cess­ing to clean up the image and work around qual­i­ty issues with the image, it is a bit more com­plex than a stan­dard CCD. The Seek cam­era does some basic pro­cess­ing in the device but most of the image manip­u­la­tion required to get the cam­era work­ing is per­formed in the Android appli­ca­tion. Seek has been promis­ing an SDK since the prod­uct was first announced, pre­sum­ably this will allow oth­er clients to be used, but no SDK has been forth­com­ing.

I have been spend­ing a fair bit of time try­ing to under­stand how to use their fac­to­ry cal­i­bra­tion val­ues and get a good tem­per­a­ture read­ing out of the device, so far unsuc­cess­ful­ly.

As a side effort I spent a bit of time work­ing on anoth­er prob­lem with the device, with more suc­cess.

When first released the cam­era had an erro­neous ther­mal gra­di­ent at the edges and par­tic­u­lar­ly the cor­ners. This was par­tic­u­lar­ly obvi­ous if you point­ed the cam­era at a ther­mal­ly flat sur­face, such as a wall, the autoscal­ing would high­light the error as the only vari­a­tion in the image. Var­i­ous peo­ple report­ed that adjust­ing the lens hold­er helped and that the prob­lem var­ied with time. I believe that the issue is a com­bi­na­tion of the lens hold­er being imper­fect­ly aligned and so its tem­per­a­ture influ­ences the sen­sor, the lens hold­er is heat­ed by the cir­cuit­ry around it and so gets worse with time.

Ear­ly this year Seek cor­rect­ed the prob­lem with a soft­ware update. Look­ing at ver­sion num­bers of each com­po­nent it was clear that the fix was pure­ly post-pro­cess­ing per­formed by the Android appli­ca­tion. They have nev­er respond­ed to ques­tions on how this was achieved.

I have man­aged to fig­ure out their tech­nique and have doc­u­ment­ed it in an Octave/Matlab func­tion which repro­duces the process used. Hope­ful­ly this will allow peo­ple mak­ing inde­pen­dent clients to apply sim­i­lar cor­rec­tions and allow the cam­era to be used with non-phone devices.

I dis­cuss details of the tech­nique on the eevblog forum where most of the Seek dis­sec­tion has tak­en place. The script is also rel­a­tive­ly sim­ple and com­ment­ed for any­one with Mat­lab expe­ri­ence.

Some before and after pho­tos of the pro­cess­ing. A ther­mal­ly flat image and some ugly face.

Before — Floor

After — Floor

Before — Face

After — Face

It is inter­est­ing to see that the cor­rec­tions to the face go far fur­ther than I ini­tial­ly expect­ed.
The fix­up in the bot­tom right cor­ner is obvi­ous, the gra­di­ent gets changed to a flat back­ground.
How­ev­er the fix­es around the bot­tom of my face were star­tling, my neck gets cor­rect­ed to a much bet­ter tem­per­a­ture, the beard cools down and the jumper col­lar cools right off. I think all these revised details are more accu­rate.

Source code, includ­ing the raw data of my face and usage instruc­tions, is on github.