Bird
0
0
Raspberry Piprogramming~20 mins

Motion detection with camera in Raspberry Pi - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Motion Detection Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
What is the output of this motion detection frame difference code?
Consider this Python snippet using OpenCV on Raspberry Pi to detect motion by frame difference. What will be printed when no motion is detected?
Raspberry Pi
import cv2

frame1 = cv2.imread('frame1.jpg', 0)
frame2 = cv2.imread('frame2.jpg', 0)
diff = cv2.absdiff(frame1, frame2)
non_zero_count = cv2.countNonZero(diff)

if non_zero_count > 1000:
    print('Motion detected')
else:
    print('No motion')
ANo motion
BMotion detected
Ccv2.error: OpenCV(…) error
DTypeError: unsupported operand type(s)
Attempts:
2 left
💡 Hint
Think about what happens when the two frames are identical or very similar.
🧠 Conceptual
intermediate
1:30remaining
Which sensor setup is best for detecting motion with a Raspberry Pi camera?
You want to detect motion using a Raspberry Pi camera module. Which setup will give the most reliable motion detection?
AUse a temperature sensor to detect heat changes
BCompare consecutive frames and check pixel differences
CUse a single frame and check if it is completely black
DCapture one frame per hour and compare with a stored image
Attempts:
2 left
💡 Hint
Motion means change over time in the camera view.
🔧 Debug
advanced
2:30remaining
Why does this Raspberry Pi motion detection code raise an error?
This code snippet is intended to detect motion but raises an error. What is the cause?
Raspberry Pi
import cv2

cap = cv2.VideoCapture(0)
ret, frame1 = cap.read()
ret, frame2 = cap.read()
diff = cv2.absdiff(frame1, frame2)
gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
_, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
    if cv2.contourArea(contour) < 1000:
        continue
    cv2.drawContours(frame1, [contour], -1, (0,255,0), 2)

cv2.imshow('Motion', frame1)
cv2.waitKey(0)
cv2.destroyAllWindows()
Acv2.VideoCapture(0) failed to open the camera
Bcv2.drawContours requires grayscale image, not color
Ccv2.findContours returns 3 values, not 2
Dcv2.threshold returns only one value, not two
Attempts:
2 left
💡 Hint
Check the number of values returned by cv2.findContours in your OpenCV version.
📝 Syntax
advanced
2:00remaining
Which option fixes the syntax error in this Raspberry Pi motion detection snippet?
Fix the syntax error in this dictionary comprehension used to count motion pixels: motion_pixels = {x: x*2 if x > 5 for x in range(10)}
Amotion_pixels = {x: (x*2 if x > 5 else 0) for x in range(10)}
Bmotion_pixels = {x: x*2 for x in range(10)}
Cmotion_pixels = {x: x*2 if x > 5 for x in range(10)}
Dmotion_pixels = {x: x*2 for x in range(10) if x > 5}
Attempts:
2 left
💡 Hint
Remember the correct order of if conditions in dictionary comprehensions.
🚀 Application
expert
3:00remaining
How many contours will be detected by this Raspberry Pi motion detection code?
Given this code snippet, how many contours will be detected if the camera captures a static scene with one moving object covering a large area?
Raspberry Pi
import cv2

# Assume frame1 and frame2 are consecutive frames
# with one large moving object

frame1 = cv2.imread('static_scene.jpg')
frame2 = cv2.imread('moving_object.jpg')
diff = cv2.absdiff(frame1, frame2)
gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
_, thresh = cv2.threshold(blur, 25, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

large_contours = [c for c in contours if cv2.contourArea(c) > 5000]
print(len(large_contours))
A1
B0
CMultiple small contours
DRaises an error
Attempts:
2 left
💡 Hint
Think about how a large moving object appears in the thresholded image.