(self, decode: bool = True)
| 510 | raise NotImplementedError("Reset is not supported.") |
| 511 | |
| 512 | def read(self, decode: bool = True) -> np.ndarray | bool: |
| 513 | if not self._cap.isOpened(): |
| 514 | return False |
| 515 | has_grabbed = self._cap.grab() |
| 516 | # If we failed to grab the frame, retry a few times if required. |
| 517 | if not has_grabbed: |
| 518 | for _ in range(self._max_read_attempts): |
| 519 | has_grabbed = self._cap.grab() |
| 520 | if has_grabbed: |
| 521 | break |
| 522 | # Report previous failure in debug mode. |
| 523 | if has_grabbed: |
| 524 | self._decode_failures += 1 |
| 525 | logger.debug("Frame failed to decode.") |
| 526 | if not self._warning_displayed and self._decode_failures > 1: |
| 527 | logger.warning("Failed to decode some frames, results may be inaccurate.") |
| 528 | # We didn't manage to grab a frame even after retrying, so just return. |
| 529 | if not has_grabbed: |
| 530 | return False |
| 531 | if self._num_frames == 0: |
| 532 | self._time_base = self._cap.get(cv2.CAP_PROP_POS_MSEC) |
| 533 | self._num_frames += 1 |
| 534 | # Need to make sure we actually grabbed a frame before calling retrieve. |
| 535 | if decode and self._num_frames > 0: |
| 536 | _, frame = self._cap.retrieve() |
| 537 | return frame |
| 538 | return True |
no outgoing calls