My first strategy was to use
libdecodeqr-webcamutility. It pretended to work, showing a view of what my laptop's camera sees, and then drawing a green box framing the QR code that it recognized. But despite my attempts to help it see better by placing a converging lens in front of the camera (or the attempt to use another camera which hates being in focus),
libdecodeqr-webcamjust wasn't displaying the correct bitcoin URI. Sometimes the tool would show a string, and some of it would even look right, but invariably there'd be some corruption.
So I just left it for a few days. I thought the channel between the phone's display and the laptop's webcam output was just too noisy to reliably scan a QR code. Not really what I expected from QR codes (they use an error-correcting code) but hey, who am I to argue with the decoding tool?
It turns out that the tool just isn't up to the task. Even running
libdecodeqr-simpleteston a locally-generated image fails, and outputs only a line of control characters. Back to searching, where I found an answer on askubuntu referring to
zbar-tools. I had previously overlooked it because the short description made no mention of QR codes, only barcodes.
zbar-toolsinstalled, I ran
zbarcamand it was able to read the QR code from the phone's display immediately - even without the extra lens. Problem solved!