You can not use openCV in this way to acces picamera. Try cap.isOpened() it should evaluate FALSE.
Just work with picamera module. For rapid capturing refer: https://picamera.readthedocs.io/en/release-1.13/recipes2.html#rapid-capture-and-processing
There are many solutions for this, but the normal way is to define a service for systemd.
Create a file /etc/systemd/system/my-service.service with this content:
systemctl enable my-service
You program should be executed the next ...
It can be difficult installing opencv on raspberry pi. A couple suggestions:
1) Use make instead of make -j4.
2) If suggestion 1 doesn't get you passes the ram stall; Try building with different opecv version. I generally get better results on the RPI when building with versions 3.4.
3) Make sure swap ram is configured properly. Adjusting the Swappiness ...
The best option for getting higher frame rate like you said you could do threading. Other options which might be better only run video capture on it no other code, ncstick, or use the pi cam. Most likely the cam you are using is for more robust systems hence why you are having lower frame rates.