Spaces:
Running
Running
| import cv2 | |
| import numpy as np | |
| def DetectMotionWithOrb(FrameOne, FrameTwo, MotionThreshold=1.0): | |
| FrameOneGray = cv2.cvtColor(FrameOne, cv2.COLOR_BGR2GRAY) | |
| FrameTwoGray = cv2.cvtColor(FrameTwo, cv2.COLOR_BGR2GRAY) | |
| OrbDetector = cv2.ORB_create() #type: ignore | |
| Keypoints1, Descriptors1 = OrbDetector.detectAndCompute(FrameOneGray, None) | |
| Keypoints2, Descriptors2 = OrbDetector.detectAndCompute(FrameTwoGray, None) | |
| if Descriptors1 is None or Descriptors2 is None: | |
| return False, 0, 0 | |
| BfMatcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) | |
| Matches = BfMatcher.match(Descriptors1, Descriptors2) | |
| Vectors = [] | |
| for Match in Matches: | |
| Pt1 = Keypoints1[Match.queryIdx].pt | |
| Pt2 = Keypoints2[Match.trainIdx].pt | |
| Vector = (Pt2[0] - Pt1[0], Pt2[1] - Pt1[1]) | |
| Vectors.append(Vector) | |
| if not Vectors: | |
| return False, 0, 0 | |
| Vectors = np.array(Vectors) | |
| AvgVector = np.mean(Vectors, axis=0) | |
| AvgX, AvgY = AvgVector | |
| TotalMagnitude = np.hypot(AvgX, AvgY) | |
| DirectionAngle = np.degrees(np.arctan2(AvgY, AvgX)) | |
| IsMotion = TotalMagnitude >= MotionThreshold | |
| return IsMotion, TotalMagnitude, DirectionAngle |