Hyphonical's picture
✨ Add Motion Detection Functionality with ORB Algorithm
cc5a426
raw
history blame
1.19 kB
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