Pythoni ja pilditöötluse kohta lisateabe saamiseks järgige seda kõikehõlmavat projekti.
Ükskõik, kas soovite töötada kaasahaarava Pythoni projekti kallal või uurida Pythoni programmeerimise erinevaid tahke, kaamerarakenduse loomine teenib seda eesmärki. See hõlmab Pythoni programmeerimise erinevate aspektide kombineerimist, nagu graafilise kasutajaliidese (GUI) arendus, pildi- ja videotöötlus ning mitme lõimega töötlemine.
Lisaks aitab selliste praktiliste väljakutsete lahendamine teie probleemide lahendamise oskusi teravdada. Need oskused on väärtuslikud mis tahes programmeerimistegevuses.
Oma keskkonna seadistamine
Alusta sellest luua uus virtuaalne keskkond. See isoleerib teie projekti ja tagab, et installitavate pakettide erinevate versioonide vahel pole konflikte. Seejärel käivitage see terminali käsk:
pip install opencv-python pillow
See käsk installib OpenCV raamatukogu ja PIL (Python Imaging Library) oma virtuaalses keskkonnas. Arvutinägemise funktsioonide jaoks kasutate OpenCV-d ja pilditöötluseks PIL-i.
Selle projekti täielik lähtekood on saadaval a GitHubi hoidla.
Nõutavate teekide importimine
Kui olete need teegid installinud, saate need importida koos muude vajalike moodulitega Pythoni standardteegist:
import tkinter as tk
import cv2
from PIL import Image, ImageTk
import os
import threading
import time
saad kasutada tkinter graafilise kasutajaliidese loomiseks teie rakenduse jaoks ning operatsioonisüsteemi, lõimede ja ajamoodulite jaoks nendega seotud funktsioonide jaoks. Eraldades osa oma koodist lõimedeks, saate lubage sellel samaaegselt töötada.
Galerii kataloogi loomine ning globaalsete muutujate ja lippude määratlemine
Looge jäädvustatud piltide ja videote salvestamiseks kataloog. See samm tagab kataloogi olemasolu enne videote jäädvustamist või salvestamist.
ifnot os.path.exists("gallery"):
os.makedirs("gallery")
Seejärel määrake image_thumbnails ja video_thumbnails muutujad. Need salvestavad galeriisse piltide ja videote pisipildid.
# Initialize image_thumbnails as a global list
image_thumbnails = []
video_thumbnails = [] # New list for video thumbnails
update_camera = True
The update_camera lipp juhib kaamera voo värskendusi.
Piltide jäädvustamine kaamera kanalist
Määrake funktsioon, mis kasutab OpenCV-d kaameravoost pildi jäädvustamiseks. Seejärel peaks see tooma kaamerast kaadri ja salvestama selle kausta galerii kataloogi ja kuvage seda kasutades näita_pilti.
defcapture_image():
ret, frame = cap.read()
if ret:
# Generate a unique filename with a timestamp
timestamp = time.strftime("%Y%m%d%H%M%S")
image_path = os.path.join("gallery", f"captured_image_{timestamp}.jpg")
cv2.imwrite(image_path, frame)
show_image(image_path)
Videosalvestuse käivitamine ja peatamine
Enne video kuvamist vajate selle loomiseks viisi. Selle saavutamiseks loo funktsioon, mis käivitab video salvestamise protsessi, kui kasutaja soovib videot jäädvustada. Funktsioon peaks ka keelama Salvestus nuppu (mitme salvestuse samaaegseks vältimiseks) ja lubage Lõpeta salvestamine nuppu. See näitab, et salvestamine on pooleli.
defstart_recording():
global video_writer, recording_start_time, recording_stopped, update_cameraifnot video_writer:
timestamp = time.strftime("%Y%m%d%H%M%S")
video_path = os.path.join("gallery", f"recorded_video_{timestamp}.mp4")# Use mp4v codec (or try other codecs)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')# Adjust frame rate and resolution if needed
video_writer = cv2.VideoWriter(video_path, fourcc, 20.0,
(640, 480))recording_start_time = time.time()
recording_stopped = False
record_button.config(state=tk.DISABLED)
stop_button.config(state=tk.NORMAL)
# Start a separate thread for recording and time-lapse display
recording_thread = threading.Thread(target=record_and_display)
recording_thread.start()
Seejärel looge funktsioon, mis peatab videosalvestuse ja vabastab videokirjutaja.
defstop_recording():
global video_writer, recording_stopped
if video_writer:
video_writer.release()
recording_stopped = True
record_button.config(state=tk.NORMAL)
stop_button.config(state=tk.DISABLED)
See funktsioon värskendab ka kasutajaliidest, mis võimaldab Salvestus nuppu ja keelake Lõpeta salvestamine nuppu. See näitab, et salvestamine on peatunud.
Videote salvestamine ja kuvamine
Looge funktsioon, mis jäädvustab pidevalt kaamerast kaadreid, töötleb neid ja kuvab need GUI-l kaamera kanalina. See peaks seda tegema, välja arvatud juhul, kui Lõpeta salvestamine nuppu vajutatakse.
defrecord_and_display():
global recording_stopped, update_camerawhile video_writer andnot recording_stopped:
ret, frame = cap.read()if ret:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# Calculate elapsed time and add it to the frame
elapsed_time = time.time() - recording_start_time
timestamp = f"Time Elapsed: {int(elapsed_time)}s"cv2.putText(frame, timestamp, (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (255, 255, 255), 2)img = Image.fromarray(frame)
photo = ImageTk.PhotoImage(image=img)
camera_feed.config(image=photo)
camera_feed.image = photovideo_writer.write(frame)
time.sleep(0.05)
camera_feed.after(10, update_camera_feed)
Funktsioon arvutab ka salvestamise algusest möödunud aja ja kuvab selle videokaadril.
Jäädvustatud piltide ja videote kuvamine
Nüüd, kui olete pildid jäädvustanud ja videod salvestanud, vajate viisi nende kuvamiseks.
Piltide kuvamiseks looge funktsioon, mis avab pildi ja kuvab selle kaamera kanalis. See saavutatakse pildi avamisel nupuga PIL, seejärel teisendades selle vormingusse, mis tkinter saab kuvada ja lõpuks värskendada kaamera sööda vidinat uue pildiga.
defshow_image(image_path):
image = Image.open(image_path)
photo = ImageTk.PhotoImage(image=image)
camera_feed.config(image=photo)
camera_feed.image = photo
Jäädvustatud videote kuvamiseks loo funktsioon, mis avab videopleieri akna, kus kasutaja saab vaadata salvestatud videoid. Samuti peatab see video esitamise ajal kaamera voo värskendused.
defplay_video(video_path):
defclose_video_player():
video_player.destroy()
global update_camera
update_camera = Trueglobal update_camera
update_camera = Falsevideo_player = tk.Toplevel(root)
video_player.title("Video Player")video_cap = cv2.VideoCapture(video_path)
defupdate_video_frame():
ret, frame = video_cap.read()if ret:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame)
photo = ImageTk.PhotoImage(image=img)
video_label.config(image=photo)
video_label.image = photo# Get the actual frame rate of the video
frame_rate = video_cap.get(cv2.CAP_PROP_FPS)
delay = int(1000 / frame_rate)video_player.after(delay, update_video_frame)
else:
video_player.destroy()video_label = tk.Label(video_player)
video_label.pack()update_video_frame()
video_player.protocol("WM_DELETE_WINDOW", close_video_player)
Kaamera voo värskenduste peatamine tagab sujuva vaatamiskogemuse.
Video pisipildi loomine ja galerii avamine
Looge funktsioon, mis loob antud video jaoks pisipildi. See muudab kasutajate huvipakkuva video tuvastamise lihtsamaks.
defcreate_video_thumbnail(video_path):
video_cap = cv2.VideoCapture(video_path)
ret, frame = video_cap.read()if ret:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
thumbnail = Image.fromarray(frame).resize((100, 100))
thumbnail_photo = ImageTk.PhotoImage(image=thumbnail)
return thumbnail_photo, os.path.basename(video_path)
returnNone, None
Järgmisena looge funktsioon, mis esitab video, kui kasutaja klõpsab galeriiaknas video pisipildil.
defplay_video_from_thumbnail(video_path):
play_video(video_path)
Seejärel loo funktsioon, mis loob uue akna, kus kasutaja saab vaadata jäädvustatud pilte ja videoid.
defopen_gallery():
global update_camera
update_camera = Falsegallery_window = tk.Toplevel(root)
gallery_window.title("Gallery")defback_to_camera():
gallery_window.destroy()
global update_camera# Resume updating the camera feed
update_camera = Trueback_button = tk.Button(gallery_window, text="Back to Camera",
command=back_to_camera)back_button.pack()
gallery_dir = "gallery"
image_files = [f for f in os.listdir(gallery_dir) if f.endswith(".jpg")]
video_files = [f for f in os.listdir(gallery_dir) if f.endswith(".mp4")]# Clear the existing image_thumbnails and video_thumbnails lists
del image_thumbnails[:]
del video_thumbnails[:]for image_file in image_files:
image_path = os.path.join(gallery_dir, image_file)
thumbnail = Image.open(image_path).resize((100, 100))
thumbnail_photo = ImageTk.PhotoImage(image=thumbnail)
image_name = os.path.basename(image_file)defshow_image_in_gallery(img_path, img_name):
image_window = tk.Toplevel(gallery_window)
image_window.title("Image")
img = Image.open(img_path)
img_photo = ImageTk.PhotoImage(img)
img_label = tk.Label(image_window, image=img_photo)
img_label.image = img_photo
img_label.pack()
img_label_name = tk.Label(image_window, text=img_name)
img_label_name.pack()thumbnail_label = tk.Label(gallery_window, image=thumbnail_photo)
thumbnail_label.image = thumbnail_photothumbnail_label.bind("
" , lambda event,
img_path=image_path,
img_name=image_name:
show_image_in_gallery(img_path, img_name))thumbnail_label.pack()
image_thumbnails.append(thumbnail_photo)# Display the image filename below the thumbnail
image_name_label = tk.Label(gallery_window, text=image_name)
image_name_label.pack()for video_file in video_files:
video_path = os.path.join(gallery_dir, video_file)# Create a video thumbnail and get the filename
thumbnail_photo, video_name = create_video_thumbnail(video_path)if thumbnail_photo:
video_thumbnail_button = tk.Button(
gallery_window,
image=thumbnail_photo,
command=lambda path=video_path: play_video_from_thumbnail(path)
)video_thumbnail_button.pack()
# Store the video thumbnail PhotoImage objects
video_thumbnails.append(thumbnail_photo)
# Display the video filename below the thumbnail
video_name_label = tk.Label(gallery_window, text=video_name)
video_name_label.pack()
Pisipildid luuakse nii piltide kui ka videote jaoks. See tähendab, et saate täissuuruses pildi vaatamiseks või video esitamiseks neil klõpsata.
Rakenduse jaoks peamise kasutajaliidese loomine
Alustage peamise loomisega tkinter rakenduse aken ja andke sellele pealkiri.
root = tk.Tk()
root.title("Camera Application")
Seejärel lähtestage vajalikud muutujad.
video_writer = None
recording_start_time = 0# Initialize recording start time
recording_stopped = False# Initialize recording_stopped flag
Seejärel looge erinevate toimingute jaoks nupud.
capture_button = tk.Button(root, text="Capture", command=capture_image)
record_button = tk.Button(root, text="Record", command=start_recording)
stop_button = tk.Button(root, text="Stop Recording", command=stop_recording)
gallery_button = tk.Button(root, text="Gallery", command=open_gallery)
quit_button = tk.Button(root, text="Quit", command=root.quit)
Peaaknas nuppude korraldamiseks kasutage ruudustiku paigutushaldurit.
capture_button.grid(row=0, column=0, padx=10, pady=10)
record_button.grid(row=0, column=1, padx=10, pady=10)
stop_button.grid(row=0, column=2, padx=10, pady=10)
gallery_button.grid(row=0, column=3, padx=10, pady=10)
quit_button.grid(row=0, column=4, padx=10, pady=10)
Looge kaameravoo kuvamiseks vidin ja lähtestage see.
camera_feed = tk.Label(root)
camera_feed.grid(row=1, column=0, columnspan=5)
cap = cv2.VideoCapture(0)
Seejärel looge funktsioon, mis värskendab pidevalt ekraanil kuvatavat kaameravoogu tkinter aken.
defupdate_camera_feed():
if update_camera:
ifnot video_writer:
ret, frame = cap.read()if ret:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame)
photo = ImageTk.PhotoImage(image=img)
camera_feed.config(image=photo)
camera_feed.image = photoroot.after(10, update_camera_feed)
update_camera_feed()
Lõpuks alustage peamist tkinter sündmuse silmus.
root.mainloop()
See silmus vastutab kasutaja interaktsioonide haldamise eest.
Rakenduse funktsioonide testimine
See video tutvustab rakenduse erinevaid funktsioone:
Pythoni oskuste teritamine OpenCV abil
Arvutinägemise osas domineerib OpenCV. See töötab paljude erinevate raamatukogudega, võimaldades teil luua palju lahedaid projekte. Saate seda kasutada Pythoniga oma programmeerimisoskuste harjutamiseks ja teravdamiseks.