I doubt you can find something faster, even in professional solutions. What you do is heavy, no matter how you do it.
With OpenGL, I think the best you can do is to use FBOs, so that transfers can happen asynchronously and avoid blocking the drawing commands. But SFML doesn't provide an API for using FBOs.
You can also find a compromise: capture only a frame very N rendered frames.