This is an app for FLIR One that I've created. It is intended to be pronounced "Eff One Ultimate". FOne is short for FLIR One, and is intended to avoid infringing on FLIR's trademark product name FLIR One, as I don't think FLIR has trademarked the name FOne. It is not yet available at the Google Play store as I haven't yet sent it to FLIR for approval (if you look at the FLIR One SDK developer website, and read about the app publishing process, it says you must submit it to FLIR prior to posting it on Google Play). It is now 95% complete, and is full of tons of features that FLIR's official app doesn't have, while only missing 3 features that the official FLIR One app does have. Note that it is only compatible with the Gen2 FLIR One, and not the newer Gen3 FLIR One and FLIR One Pro. This is because image dimensions (for both the infrared and visible light images) are hardcoded into the app. If you don't already have a Gen2 FLIR One, you should buy one now, before FLIR stops selling them, if you want your FLIR One to work with my app.
Missing features in my app are:
spot meter
alignment of visible and IR images for MSX
saving FLIR proprietary radiometric JPG images
Added features in my app:
access to all image types
ability to save raw images as 16bit grayscale tif files
ability to save raw video in a format I designed myself to support 16bit grayscale (no standard video format like AVI supports this)
ability to control the app via a desktop/laptop PC over WLAN, using UDP
ability to stream Raw IR or Thermal IR video to a desktop/laptop PC over WLAN, using TCP
The rest of this post is a user-manual on its features (note that position terms like "above", "left", or "bottom" are assuming that your device is held in portrait orientation):
When the FLIR One is turned on and plugged in, the text Connected will appear under the app's title on the title bar. When the FLIR One is unplugged or turned off or disconnected the text will change to say Disconnected.
Below the title Just below the image window, on the left side of the screen there's a battery percentage window.
At the bottom of the screen are 6 buttons. These are Settings, Settings 2, Start Remote, Save Image, Save Video, and Start Stream.
The menu that is displayed for the Settings button contains the buttons for setting Image Type and Palette (which is used for IR Image and MSX Image image types), as well as a check box to enable/disable automatic calibration, and a button to manually perform a single calibration.
The available Image Types are Raw IR, Thermal IR, IR Image, MSX Image, Visible Image, and Raw Visible.
The Raw IR image is 120x160, and is the least processed image format (though technically not completely raw, as hot-pixel removal and other such operations are performed internally either by the FLIR One's firmware or internally in the parts of the SDK that are pre-compiled binaries and therefore can't be altered by the app developer using the SDK in their app).
The Thermal IR image is 240x320. This image is generated internally by FLIR's SDK (not my app) by cropping the image to raw image to 90x120 and then upscaling to 240x320. Also the raw values are used in a formula (along with emissivity and Planck constants) to compute actual temperatures, so that the pixels represent temperature (measured in centikelvin) rather than actual raw microbolometer sensor readings.
The IR Image image is 480x640. This is an upscaled version of the Thermal IR image and has been histogram equalized (or at least brightness stretched), as well as having had a color palette applied to it (again via either the firmware in the FLIR One or in a pre-compiled binary in the SDK).
The MSX Image image is 480x640. This is a combination of IR Image and Visible image, where an upscaled copy of the Visible Image is high-pass-filtered and used to add detail to the overall image. Again, this is some kind of internal process, and is not an algorithm that I implemented.
The Visible Image image is 240x320. This is one of the 2 image types that uses the visible light image from the FLIR One's visible light camera. This is a cropped and rotated copy of the Raw Visible image. Again cropping occurs internally in either the firmware or in a pre-compiled binary in the SDK. While uncompressed (unlike the Raw Visible image), that is only because this image is generated after decompressing the Raw Visible image.
The Raw Visible image is a JPEG compressed copy of the 640x480 image from the FLIR One's visible light camera. As far as I know, there is no way to access the uncompressed copy of the visible light image. This is the rawest form of the visible light image that is possible to get with the FLIR One SDK.
The Settings 2 button opens up a menu which has (at this time), the following features. IP Address and Port Number for remote UDP control of the app. The IP address is a filter, to make it so the app only accepts UDP packets from a computer with the specified IP address (using 0.0.0.0, which is the default, means it accepts UDP packets from all computers on the LAN). The Port Number is the local port that it binds to to listen for UDP packets. It also the IP Address and Port Number for TCP streaming. This is the remote address and port number that FOne Ultimate will try to connect to to stream. The software on the remote computer must be acting as a server (listening for incoming connections), as the FOne Ultimate app acts as a TCP client (attempting to connect to the remote computer).
The Save Image button saves a still picture, who's format depends on the Image Type. For Raw IR and Thermal IR image types, the format is 16bit grayscale uncompressed TIFF (.tif file extension). For IR Image, MSX Image, and Visible Image image types, the format is 32bits (8-bits-per-channel 4-channels B,G,R,unused) color uncompressed Bitmap image (.bmp file extension). For Raw Visible image type, the format is 24bits color compressed JPEG (.jpg file extension). For all image types, except for Raw Visible (because it's compressed, so I don't have access to the individual pixel data), the saved image is rotated by my app, prior to saving, based on the orientation of the phone.
The Save Video button starts recording a video in BVF format (a video file format I created for this very purpose, with file extension .bvf). While recording, the button changes to say Stop Video, which stops the recording. Depending on the speed of your device, the rotation operation may not be able to be performed in real-time, and as such no orientation-based rotation is performed for video being recorded (only for saved still pictures). To rotate it to the correct, orientation, you will need to copy the .bvf file from your phone to your PC, and use PC software I created to rotate it to the correct orientation. Also because this is a video file format I created myself, no current standard video player (WMP, VLC, etc) will play it, so you will instead need to use the BVF video player I wrote specifically for this purpose (note that this BVF player also allows you to export an MP4 video file to play with standard video players, and also note that this feature requires that a copy of ffmpeg.exe is present in the same folder as the BVF video player's exe file, in order to use that function). You can download a copy of the latest (as of me posting this) version of FFMPEG at
http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20170702-c885356-win32-static.zipThe Start Remote button makes it start accepting commands sent coming in as UDP packets from a "remote" computer. Each command is a 5 letter ASCII (1-byte-per-letter) string. The available commands are as follows (note that they are case sensitive, and if the command has 4 letters/numbers, there is a space after it to make it exactly 5 characters long).
"IMGT1" = set Image Type to Raw IR
"IMGT2" = set Image Type to Thermal IR
"IMGT3" = set Image Type to IR Image
"IMGT4" = set Image Type to MSX Image
"IMGT5" = set Image Type to Visible Image
"IMGT6" = set Image Type to Raw Visible
"PAL1 " = set Palette to Grayscale
"PAL2 " = set Palette to Ironbow
"PAL3 " = set Palette to Rainbow
"PAL4 " = set Palette to Rainbow HC
"PAL5 " = set Palette to Arctic
"PAL6 " = set Palette to Lava
"PAL7 " = set Palette to Wheel
"PAL8 " = set Palette to Coldest
"PAL9 " = set Palette to Hottest
"SAVEI" = save image
"SAVEV" = start recording video
"STOPV" = stop recording video
When in UDP remote controlled mode, the Start Remote button changes to Stop Remote, and pressing it takes it takes the app back out off UDP remote controlled mode.
When you press the Start Stream button, it attempts to establish a TCP connection to the remote computer. If it successful, it starts streaming the video in the following format
First 4 bytes per frame are a little endian 4-byte-integer that contains the Image Type's number (0 to 5), followed by the pixel bytes for that frame. It's a very simple format. The remote receiver of the stream only needs to know the image dimensions and bit depth and channel count of each of the formats (which is already specified here in this manual), and set up a byte array accordingly to read the TCP stream of pixel bytes into. When streaming, the Start Stream button changes into the Stop Stream button. Pressing Stop Stream stops the app from sending frames over the TCP connection, and then disconnects the TCP connection.
Here I have linked (too big for a forum attachment) to a ZIP file I uploaded to Mediafire with the following contents.
https://www.mediafire.com/?ptt0gthg8mn5pgathe debug APK file for the FOne Ultimate app (note it's not 100% complete yet, and there may still be some bugs)
the BVF video player's EXE file (this is essential for viewing the videos saved by FOne Ultimate)
the BVF video rotator's EXE file (this is essential for rotating the video frames in BVF video files, whenever they were recorded with the phone in any orientation other than portrait)
Note that the slider in BVF Video Rotator doesn't select the frame to rotate (when rotation occurs, all the frames get rotated), it simply changes the currently selected frame being viewed so you can examine them for visual clues for what direction to rotate the video in (if you don't remember what orientation you had the phone in at the time you recorded the particular video). When you press one of the 4 buttons to rotate the video, it rotates all the frames in the video, by the amount indicated by the button that you clicked.