前のチュートリアルでは、Python と Tkinter を使用してカスタマイズ可能な GUI 時計を構築しました。さらに一歩進めて、ユーザーがオンデマンドで画像をキャプチャして保存できるカメラ機能を追加してみましょう。このプロジェクトでは、Python でのカメラ入力の操作を紹介し、GUI 開発とファイル処理のスキルを強化します。
始める前に、必要なライブラリがインストールされていることを確認してください。カメラの処理には OpenCV を使用します。 pip を使用してインストールします:
pip install opencv-python
次に、pip を使用して Pillow をインストールします。
pip install Pillow
すべての依存関係をインストールしたので、カメラを追加できます。通常のカメラとクリックの背後に隠されたカメラの 2 種類のカメラを作成します。
一緒にいてください。
import cv2 from PIL import Image, ImageTk import os from datetime import datetime
カメラキャプチャを処理する関数を追加しましょう:
def capture_image(): # Initialize the camera cap = cv2.VideoCapture(0) if not cap.isOpened(): print("Error: Could not open camera.") return # Capture a frame ret, frame = cap.read() if not ret: print("Error: Could not capture image.") cap.release() return # Create a directory to store images if it doesn't exist if not os.path.exists("captured_images"): os.makedirs("captured_images") # Generate a unique filename using timestamp timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"captured_images/image_{timestamp}.png" # Save the image cv2.imwrite(filename, frame) print(f"Image saved as {filename}") # Release the camera cap.release() # Display the captured image display_image(filename)
初心者にもわかりやすいように、capture_image() 関数を詳しく見てみましょう。各部分を段階的に説明し、何が起こっているのか、そしてなぜ起こっているのかを説明します。
`def capture_image()`
この行は、capture_image() という新しい関数を作成します。関数は、写真を撮りたいときにいつでも使用できる一連の命令であると考えてください。
`cap = cv2.VideoCapture(0)`
ここではカメラをセットアップしています。デジタル カメラの電源を入れているところを想像してください:
if not cap.isOpened(): print("Error: Could not open camera.") return
この部分は、カメラが適切にオンになっているかどうかをチェックします:
return は、問題がある場合に「ここで停止して関数を終了する」ことを意味します。
ret、frame = cap.read()
今、実際の写真を撮っています:
cap.read() はカメラのシャッター ボタンを押すのと似ています。
それによって次の 2 つのことが得られます:
if not ret: print("Error: Could not capture image.") cap.release() return
これにより、写真が正常に撮影されたかどうかがチェックされます:
エラーメッセージを出力します。
cap.release() はカメラをオフにします。
return は関数を終了します。
if not os.path.exists("captured_images"): os.makedirs("captured_images")
この部分では、写真を保存するための特別なフォルダーを作成します:
if not os.path.exists("captured_images"):` checks if a folder named "captured_images" already exists.
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"captured_images/image_{timestamp}.png"
ここでは、画像に一意の名前を作成しています:
datetime.now() は現在の日付と時刻を取得します。
.strftime("%Y%m%d_%H%M%S") は、時間を "20240628_152059" (年-月-日_時分秒) のような文字列にフォーマットします。
cv2.imwrite(filename, frame) print(f"Image saved as {filename}")
今、写真を保存しています。
v2.imwrite(filename, Frame) は、作成したファイル名で画像 (フレーム) を保存します。
次に、画像が保存された場所を示すメッセージを出力します。
`cap.release()`
この行は、完了時に電源ボタンをもう一度押すなどして、カメラの電源をオフにします。
`display_image(filename)`
最後に、別の関数を呼び出して、撮ったばかりの写真を画面に表示します。
要約すると、この関数は次のことを行います。
各ステップには、物事が正しく動作していることを確認するためのチェックが含まれており、いずれかの時点で問題がある場合は、機能が停止し、何が問題だったかを通知します。
キャプチャした画像を表示する機能を追加します:
def display_image(filename): # Open the image file img = Image.open(filename) # Resize the image to fit in the window img = img.resize((300, 200), Image.LANCZOS) # Convert the image for Tkinter photo = ImageTk.PhotoImage(img) # Update the image label image_label.config(image=photo) image_label.image = photo
初心者向けのファイル操作の説明から始めて、次にコードを詳しく見ていきましょう。
初心者向けのファイル操作:
読む:
書き込み:
Execute:
Now, let's focus on the display_image(filename) function:
`def display_image(filename)`
This line defines a function named display_image that takes a filename as input. This filename is the path to the image we want to display.
`img = Image.open(filename)`
Here's where we use the "read" operation:
This operation doesn't change the original file; it allows us to work with its contents.
img = img.resize((300, 200), Image.LANCZOS)
This line resizes the image:
Image.LANCZOS is a high-quality resizing method that helps maintain image quality.
photo = ImageTk.PhotoImage(img)
This line converts the image for use with Tkinter (the GUI library we're using):
image_label.config(image=photo) image_label.image = photo
These lines update the GUI to show the image:
In summary, this function does the following:
This process doesn't involve writing to the file or executing it. We're simply reading the image, processing it in memory, and displaying it in our application.
Update your existing GUI to include a button for image capture and a label to display the image:
# Add this after your existing GUI elements capture_button = tk.Button(window, text="Capture Image", command=capture_image) capture_button.pack(anchor='center', pady=5) image_label = tk.Label(window) image_label.pack(anchor='center', pady=10)
You may need to adjust the window size to accommodate the new elements:
window.geometry("350x400") # Increase the height
Here's the complete code incorporating the new camera feature:
import tkinter as tk from time import strftime import cv2 from PIL import Image, ImageTk import os from datetime import datetime window = tk.Tk() window.title("Python GUI Clock with Camera") window.geometry("350x400") is_24_hour = True def update_time(): global is_24_hour time_format = '%H:%M:%S' if is_24_hour else '%I:%M:%S %p' time_string = strftime(time_format) date_string = strftime('%B %d, %Y') time_label.config(text=time_string) date_label.config(text=date_string) time_label.after(1000, update_time) def change_color(): colors = ['black', 'red', 'green', 'blue', 'yellow', 'purple', 'orange'] current_bg = time_label.cget("background") next_color = colors[(colors.index(current_bg) + 1) % len(colors)] time_label.config(background=next_color) date_label.config(background=next_color) def toggle_format(): global is_24_hour is_24_hour = not is_24_hour def capture_image(): cap = cv2.VideoCapture(0) if not cap.isOpened(): print("Error: Could not open camera.") return ret, frame = cap.read() if not ret: print("Error: Could not capture image.") cap.release() return if not os.path.exists("captured_images"): os.makedirs("captured_images") timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"captured_images/image_{timestamp}.png" cv2.imwrite(filename, frame) print(f"Image saved as {filename}") cap.release() display_image(filename) def display_image(filename): img = Image.open(filename) img = img.resize((300, 200), Image.LANCZOS) photo = ImageTk.PhotoImage(img) image_label.config(image=photo) image_label.image = photo time_label = tk.Label(window, font=('calibri', 40, 'bold'), background='black', foreground='white') time_label.pack(anchor='center') date_label = tk.Label(window, font=('calibri', 24), background='black', foreground='white') date_label.pack(anchor='center') color_button = tk.Button(window, text="Change Color", command=change_color) color_button.pack(anchor='center', pady=5) format_button = tk.Button(window, text="Toggle 12/24 Hour", command=toggle_format) format_button.pack(anchor='center', pady=5) capture_button = tk.Button(window, text="Capture Image", command=capture_image) capture_button.pack(anchor='center', pady=5) image_label = tk.Label(window) image_label.pack(anchor='center', pady=10) update_time() window.mainloop()
You've now enhanced your GUI clock with a user-controlled camera feature. This addition demonstrates how to integrate hardware interactions into a Python GUI application, handle file operations, and dynamically update the interface.
Always respect user privacy and obtain the necessary permissions when working with camera features in your applications.
以上がユーザー制御のカメラ機能を Python GUI クロックに追加するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。