We take a lot of photos on a Sony Xperia Z3 running Cyanogenmod. Unfortunately, the camera support for that particular model introduces pincushion distortion on every photo it takes:
Notice the curved edges of the picture frames in the first image. The second image has been corrected. The animation shows both images superimposed, so you can see the effect of the distortion more clearly.
We haven’t been able to find an app for automatically correcting the input from the camera as it comes in, so we’ve cobbled together a solution based on Dropbox. It’s crude but effective!
Overview of our solution
The solution is to use a cloud server linked to Dropbox to process images placed in a special Dropbox folder.
On the phone, I choose the pictures I want to send through the repair pipeline, and “share” them to the Dropbox app in the correct folder.
Step-by-step, here’s how it works:
- Take a photo on the phone.
- Copy the image to a special folder in Dropbox.
- Dropbox copies it over to the server, which scans the folder periodically.
- A little python program fixes the files and puts them into a different Dropbox folder.
After this process, the repaired images are available via the Dropbox app on the phone.
I use djb’s daemontools to run the little program I wrote that scans Dropbox for JPGs. That program calls out to ImageMagick’s convert program to repair the barrel distortion, and then writes the results back to Dropbox and deletes the input file.
We found the right parameters to use,
convert input.jpg -distort barrel '0.0132 -0.07765 0.14683' output.jpg,
this XDA-Developers forum page.
I’ve put the source code for the python program on Github: