In the process of creating our OxyPonics system, we realized we needed to make a cheap, flexible, camera system capable of quantifying and localizing our optical signals. To keep costs low, we built our system out of a ten dollar camera and a Raspberry Pi. This allows us to properly image and track fluorescence to a reasonable degree without the need for expensive lab equipment like plate readers or spectrofluorometers. Using OpenCV, an open-source package for computer vision, we created software to track the fluorescent signal in our frame, efficiently eliminate noise, and record and send the measured intensity to a web server which tracks the readings. While our optics are designed for rxRFP, our software works for any wavelength and is capable of cheaply identifying and quantifying localized fluorescence in a wide variety of environments, providing a powerful tool for labs on a budget. Our software can be accessed on our GitHub here.
Our fluorescence signal comes in the form of an image from our camera. While the optical filter on the camera removes most of the stray and excitation light, there is still a noticeable background. To account for this, we mask the image for only the color range of the fluorescent light, which blocks out background from other parts of the image. We then find contours in this mask to locate position of the fluorescence, and integrate over this contour to find the average fluorescence intensity. Our software automatically records measurements at various excitation intensities and records this information to a log file; a slight modification (commented) allows it to send this data to a remote web server as well. If users choose to use the full automation of the software, users only need to set the data once, freeing them to perform other tasks while still examining the data in real time.
We implemented a rudimentary Kalman filter in order to process our data. The base code came from here, but was modified to use our actual measurements and incorporate our model. It was also generalized to work for a vector state variable.
A simple web server implemented in Express with MongoDB allows for remote storage of data as it is collected. Endpoints for additional data are easy to set up, following the example of the existing ones. This is useful for when the processing power or storage on the Raspberry Pi is not enough, or when one wants a more permanent backup of the data.