- Fix critical resource leak when cv2.VideoCapture.isOpened() returns False:
create capture in local variable, verify it opened, call .release() before
raising RuntimeError, only assign to self._capture after confirming success
- Fix potential leak on repeated open(): release any existing self._capture
before creating a new one
- Add regression test: test_open_raises_when_capture_not_opened now verifies
.release() is called on failed capture
- Add new test: test_open_twice_releases_first_capture verifies first capture's
.release() is called before second is assigned
All 28 tests passing (5 camera + 23 existing).