Here's the scanner first being assembled:
The completed scanner ready to scan:
The original LED light was replaced with a larger LED array. To avoid glare, the array is mounted perpendicularly so the long side is parallel with the spine of the book. All of the interior surfaces of the book scanner are painted black, to avoid casting reflections on the glass. The glass was taken from two flatbed scanners and cut down to size by hand.
We use two Canon cameras connected with USB to a computer and remote-controlled with a Python script that uses the gphoto2 library. You can find the full list of cameras supported by gphoto2 here. The pictures are transferred to the computer as soon as they are taken, rather than stored on an SD card.
The cameras are triggered by a button mounted next to the handle on the scanner. The button is connected to a circuit board from a USB keyboard, so it behaves like pressing the "enter" key on the computer.
The scanning is handled by a custom Python script, which uses gphoto2 to connect with the cameras and displays images of the scanned pages in an HTML view. Three USB ports are required for the monitoring computer: One each for the two cameras, and one for the triggering mechanism. Post-processing is handled with ScanTailor, an OCR script using Tessaract, and various other scripts.