Building a Simple Spy Camera with Python
Scofield Idehen
Posted on February 26, 2024
A spy camera lets you secretly record videos or take images without noticing. Python is a great language for building such an application thanks to its extensive libraries for computer vision and graphical interface development.
This comprehensive guide will teach you how to build a simple spy cam using Python and OpenCV.
Are you a beginner in python, learn how to Build a Mad Libs Word Game in Python
First, create a folder.
mkdir python_spy_cam
Next, we would cd into the python_spy_cam directory and create a virtual environment python -m venv myenv
to avoid having issues with dependencies.
Activate the Virtual environment source myenv/bin/activate,
and then we can install dependencies.
Run pip install opencv-python
to install the OpenCV
library and run the pip install Pillow
to install the PIL library.
Importing the Required Libraries
Start by importing the libraries we need:
import cv2
import tkinter as tk
from PIL import Image, ImageTk
import datetime
import os
-
cv2
- OpenCV library for computer vision -
tkinter
- For building GUI -
PIL
- For image processing -
datetime
- For generating timestamps -
os
- For handling files and directories ## Creating the Output Directory
We need a directory to store the photos and videos captured by our spy cam.
output_dir = os.path.join(os.path.expanduser("~"), "spycam_output")
if not os.path.exists(output_dir):
os.makedirs(output_dir)
This will create the directory if it doesn't already exist.
Initializing the Camera
Let's initialize the camera using OpenCV:
cap = cv2.VideoCapture(0)
We pass 0 to access the default webcam.
Loops are quite hard to grasp, but find an easy way to learn Python Loops: A Comprehensive Guide for Beginners
Building the GUI
We will use tkinter
to build a simple GUI for our spy cam app.
First, create the main window:
root = tk.Tk()
root.title("My Spy Cam")
Then add buttons to take photo, record video, and quit the app:
btn_photo = tk.Button(root, text="Take Photo")
btn_video = tk.Button(root, text="Record Video")
btn_quit = tk.Button(root, text="Quit")
btn_photo.pack()
btn_video.pack()
btn_quit.pack()
We use .pack()
to organize the widgets.
Capturing Photos
When the user clicks the Take Photo button, we will capture a frame from the camera and save it as an image file.
def take_photo():
print("Taking photo...")
ret, frame = cap.read()
if ret:
timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
filename = f"spycam_photo_{timestamp}.jpg"
output_file = os.path.join(output_dir, filename)
print(f"Saving photo to {output_file}")
cv2.imwrite(output_file, frame)
We generate a filename with a timestamp and save the image.
Recording Video
We need to create a VideoWriter
object to record a video.
output_path = ""
output_video = None
def start_recording():
global output_path, output_video
now = datetime.datetime.now()
filename = now.strftime("%Y-%m-%d_%H-%M-%S") + ".avi"
output_path = os.path.join(output_dir, filename)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
output_video = cv2.VideoWriter(output_path, fourcc, 20.0, (640,480))
def stop_recording():
output_video.release()
We can call these functions when the user clicks the Record Video button to start/stop recording.
In the main loop, check if we are recording and write frames to video file:
btn_take_photo.config(command=take_photo)
btn_record_video.config(command=start_recording)
Running the Spy Camera
Finally, we call root.mainloop()
to start the GUI event loop and show the live camera feed.
Here is the complete code:
import tkinter as tk
import cv2
from PIL import Image, ImageTk
import datetime
import os
# Get home directory and create output dir
output_dir = os.path.join(os.path.expanduser("~"), "spycam_output")
if not os.path.exists(output_dir):
os.makedirs(output_dir)
print(f"Saving photos and videos to: {output_dir}")
# Initialize Camera
cap = cv2.VideoCapture(0)
# GUI Window
root = tk.Tk()
root.title("My Spy Camera")
# Buttons
btn_take_photo = tk.Button(root, text="Take Photo")
btn_record_video = tk.Button(root, text="Record Video")
btn_quit = tk.Button(root, text="Quit")
btn_take_photo.pack()
btn_record_video.pack()
btn_quit.pack()
# Variables
output_video_path = ""
output_video_writer = None
# Functions
def take_photo():
print("Taking photo...")
ret, frame = cap.read()
if ret:
timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
filename = f"spycam_photo_{timestamp}.jpg"
output_file = os.path.join(output_dir, filename)
print(f"Saving photo to {output_file}")
cv2.imwrite(output_file, frame)
# Video Recording Functions
output_path = ""
output_video = None
def start_recording():
global output_path, output_video
now = datetime.datetime.now()
filename = now.strftime("%Y-%m-%d_%H-%M-%S") + ".avi"
output_path = os.path.join(output_dir, filename)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
output_video = cv2.VideoWriter(output_path, fourcc, 20.0, (640,480))
def stop_recording():
output_video.release()
# Bind Buttons
btn_take_photo.config(command=take_photo)
btn_record_video.config(command=start_recording)
root.mainloop()
And that's it! We have built a simple spy camera app in Python that can secretly capture photos and videos.
Some ways you can extend this project further:
- Add the option to select different cameras
- Build a motion detection system to start recording when movement is detected
- Add timestamp overlay on captured media
- Implement email/FTP upload option
- Package it as a Linux application that launches on system startup
I hope you enjoyed this step-by-step guide for building a spy camera in Python! Let me know if you have any other questions.
If you like my work and want to help me continue dropping content like this, buy me a cup of coffee.
If you find this post exciting, find more exciting posts on Learnhub Blog; we write everything tech from Cloud computing to Frontend Dev, Cybersecurity, AI, and Blockchain.
Resource
Posted on February 26, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.