You actually ask two unrelated questions. The first question got a complete answer from MH under dsiguise of a comment.
The second answer is: you cannot control the frames that are displayed by camera preview (whether this be camera SurfaceView, or TextureView, or SurfaceTexture). You can hide1 all preview frames (e.g. simply overlay the camera preview with another non-transparent view), but still receive the preview frames in onPreviewFrame() callback. You can perform whatever processing in your callback2, and display the frame (as it arrives from the camera, or changed by your processing) in your favorite manner (using Canvas, or OpenGL, or something else).
Footnotes:
1 There are many attempts to run Android camera without displaying the preview. Each such approach has its limitations, and don't work flawlessly on all devices.
Note that if you choose the SurfaceTexture + OpenGL approach, it is relatively easy to reliably hide the raw preview flow, and only show the frames that correspond to your criteria.
2 It is not impossible to perform image processing in OpenGL, e.g. see replacing glReadPixels with EGL_KHR_image_base for faster pixel copy, but this involves advanced device-dependent techniques.