saalek110
Well-Known Member
برنامه گرفتن ۴ عکس با فاصله چند ثانیه و ذخیره کردن در پوشه ای در پوشه دانلود:
Python:
import cv2
import numpy as np
import time
import os
from datetime import datetime
print("=" * 60)
print(" برنامه عکسبرداری زماندار با دوربین تبلت")
print("=" * 60)
print("ویژگیها:")
print("• گرفتن ۴ عکس با فاصله ۵ ثانیه")
print("• نمایش ۴ عکس کنار هم")
print("• ذخیره خودکار عکسها")
print("=" * 60)
# تنظیمات
NUM_PHOTOS = 4
DELAY_SECONDS = 5
PHOTO_WIDTH = 320
PHOTO_HEIGHT = 240
# استفاده از پوشه Download که دسترسی آسانتر دارد
save_folder = "/storage/emulated/0/Download/PhotoGrid/"
try:
os.makedirs(save_folder, exist_ok=True)
print(f" عکسها در این پوشه ذخیره میشوند: {save_folder}")
except:
# اگر نشد، از پوشه فعلی برنامه استفاده کن
save_folder = "./PhotoGrid/"
os.makedirs(save_folder, exist_ok=True)
print(f" عکسها در این پوشه ذخیره میشوند: {save_folder}")
# راهاندازی دوربین
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("❌ خطا: نمیتواند به دوربین دسترسی پیدا کند")
exit()
# تنظیم رزولوشن دوربین
cap.set(cv2.CAP_PROP_FRAME_WIDTH, PHOTO_WIDTH)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, PHOTO_HEIGHT)
print(f"✅ دوربین فعال شد - رزولوشن: {PHOTO_WIDTH}x{PHOTO_HEIGHT}")
print(f"⏱️ گرفتن {NUM_PHOTOS} عکس با فاصله {DELAY_SECONDS} ثانیه...\n")
# لیست برای ذخیره عکسها
photos = []
photo_times = []
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
# گرفتن عکسها
for i in range(NUM_PHOTOS):
print(f"\n عکس {i+1} از {NUM_PHOTOS}:")
# شمارش معکوس
countdown_str = ""
for countdown in range(DELAY_SECONDS, 0, -1):
countdown_str += f"{countdown}... "
print(f"{countdown}...", end=' ', flush=True)
time.sleep(1)
print("عکس!\n")
# گرفتن عکس
ret, frame = cap.read()
if not ret:
print(f"❌ خطا در گرفتن عکس {i+1}")
# اضافه کردن تصویر سیاه به جای عکس خطا
black_frame = np.zeros((PHOTO_HEIGHT, PHOTO_WIDTH, 3), dtype=np.uint8)
cv2.putText(black_frame, 'ERROR', (50, 120),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
frame = black_frame
# ذخیره عکس اصلی
photo_time = datetime.now().strftime("%H%M%S")
filename = f"{save_folder}photo_{i+1}_{photo_time}.jpg"
try:
cv2.imwrite(filename, frame)
saved = True
except:
# اگر ذخیره نشد، فقط در حافظه نگه دار
filename = f"photo_{i+1}_{photo_time}.jpg"
saved = False
# اضافه کردن متن زمان و شماره عکس روی تصویر
annotated_frame = frame.copy()
cv2.putText(annotated_frame, f'Photo {i+1}', (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.putText(annotated_frame, f'Time: {photo_time}', (10, 60),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
photos.append(annotated_frame)
photo_times.append(photo_time)
status_msg = "✅ ذخیره شد" if saved else "⚠️ فقط در حافظه"
print(f" {status_msg}: {filename}")
# آزاد کردن دوربین
cap.release()
print("\n" + "="*50)
print(f"✅ تمام {NUM_PHOTOS} عکس گرفته شدند")
print("="*50)
# ایجاد تصویر ترکیبی (گرید)
if len(photos) > 0:
print("\n در حال ایجاد تصویر ترکیبی...")
# اگر تعداد عکسها کمتر از ۴ بود، با تصاویر سیاه پر کن
while len(photos) < 4:
black_img = np.zeros((PHOTO_HEIGHT, PHOTO_WIDTH, 3), dtype=np.uint8)
cv2.putText(black_img, 'No Photo', (50, 120),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2)
photos.append(black_img)
photo_times.append("------")
# ایجاد گرید ۲×۲
# ردیف اول: عکس ۱ و ۲
row1 = np.hstack((photos[0], photos[1]))
# ردیف دوم: عکس ۳ و ۴
row2 = np.hstack((photos[2], photos[3]))
# ترکیب ردیفها
photo_grid = np.vstack((row1, row2))
# اضافه کردن عنوان
grid_with_title = cv2.copyMakeBorder(photo_grid, 50, 20, 20, 20, cv2.BORDER_CONSTANT, value=[40, 40, 40])
cv2.putText(grid_with_title, f'Photo Grid - {timestamp}', (20, 35),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 2)
# ذخیره تصویر ترکیبی
grid_filename = f"{save_folder}photo_grid_{timestamp}.jpg"
try:
cv2.imwrite(grid_filename, grid_with_title)
print(f"✅ تصویر ترکیبی ایجاد و ذخیره شد: {grid_filename}")
except Exception as e:
print(f"⚠️ تصویر ترکیبی ذخیره نشد: {e}")
grid_filename = "در حافظه (ذخیره نشد)"
# نمایش اطلاعات در ترمینال
print("\n" + "="*60)
print(" گزارش عکسبرداری:")
print("="*60)
print(f"تاریخ: {datetime.now().strftime('%Y/%m/%d')}")
print(f"زمان شروع: {timestamp}")
print(f"تعداد عکس: {NUM_PHOTOS}")
print(f"فاصله زمانی: {DELAY_SECONDS} ثانیه")
print(f"\n جزئیات عکسها:")
for i in range(len(photos[:NUM_PHOTOS])):
print(f" عکس {i+1}: زمان {photo_times[i]}")
print(f"\n پوشه ذخیره: {save_folder}")
print(f"️ تصویر ترکیبی: photo_grid_{timestamp}.jpg")
print("="*60)
# نمایش گرید به صورت ASCII در ترمینال
print("\n پیشنمایش گرید (مقیاس کوچک):")
print("┌" + "─"*64 + "┐")
# ایجاد نسخه کوچک برای نمایش ASCII
small_grid = cv2.resize(photo_grid, (60, 30))
gray_grid = cv2.cvtColor(small_grid, cv2.COLOR_BGR2GRAY)
# کاراکترهای ASCII برای نمایش
ascii_chars = "@%#*+=-:. "
for y in range(30):
line = "│ "
for x in range(60):
pixel = gray_grid[y, x]
char_idx = min(pixel // 32, len(ascii_chars) - 1)
line += ascii_chars[char_idx]
line += " │"
print(line)
print("└" + "─"*64 + "┘")
# راهنمای مشاهده عکسها
print("\n نحوه مشاهده عکسها:")
print("1. به پوشه Download بروید")
print("2. پوشه PhotoGrid را باز کنید")
print("3. فایل photo_grid_...jpg را ببینید")
else:
print("❌ هیچ عکسی گرفته نشد!")
print("\n✅ برنامه با موفقیت به پایان رسید")
print("[Program finished]")









