I suppose it depends on what you want the data for, 20% error may be achievable but then is it any use? I did some experiments on using video to measure distance and on a flat surface (my patio) I could get to around 1% but on uneven surfaces the accuracy dropped away quite a lot.
FWIW - the technique I tried was fastening a laser pointer to the camera parallel to the axis of the lens. The distance from the centre of the lens to the laser dot on a surface is then always the same, so the number of pixels between the dot and the image center is known, so from this if you know the number of pixels moved between two frames you can get the distance moved between frames. I used the OpenCV library to do the image processing and optical flow.
The issue with uneven surfaces is that the distance to each feature in the frame varies so the features being tracked may not be at the same distance from the camera as the surface on which the laser dot falls.