The Thermal Expert also has a rolling shutter.
A little update on the camera: I've finally found a bit of free time to play around with the SDK I was sent by i3. The SDK is a bit clunky and simplistic. The only provided function to get data from the camera returns a normalised 16bit image. It's better than nothing, but I'd really like a way to get the direct raw data.
The SDK provides a method to calculate the temperature at a given x y coordinate. Combining this with the normalised image gives me a way to approximate the temperature of the entire image (find min/max points, calculating temp of those points and then adjust the range). However here we come to another quirk of the SDK; the calc temperature methods in the SDK do not operate on the same frame that was returned when reading the image. The function seems to operate on the following frame.
I did a bit of digging in the SDK and I think I've figured out how the camera and drivers work. The camera seems to be a bit of a dumb device. After being plugged in it simply returns data in the following order: calibration, dead pixels and then image data. The data is not returned in response to a request from the pc. The sdk effectively does the following:
- calibrationData = read( n_bytes )
- deadPixels = read( n_bytes )
- imageData = read( n_bytes )
I'm sure the camera can do something more clever, but the SDK I was given doesn't use that functionality. An annoying side-effect this "dumb device" mode is that the camera must be unplugged in between runs of the program. If the camera is not unplugged between runs, the SDK will interpret the image data being returned as calibration data and dead pixel data. When this happens all image frames returned by the SDK are be completely blank. (I assume because the SDK suddenly thinks that all the pixels are dead-pixels). This should be trivial to fix; the camera should be "reset" when the user calls the init function.
Complaints aside, it's pretty great once you have real time (ish) thermal image data in an openCV friendly form. You can really start doing fun things
The first thing I did was create a local-normalised image inspired by the ThermApp's "night vision" mode.
It works pretty well until there is too much dynamic range in a scene. There is no way to lock the gain of the sensor, so when there is something very hot (e.g., a match) in the scene, we start to see the limits of some part of the system (could be sensor, ADC, firmware, or SDK).
Normal Scene:
With radiator visible:
With match in scene: