برنامه ای که یک فایل عکس می سازد ، اشکالی درش هست. فایل را ذخیره می کند
و بعد مجدد فایل را می خواند و مربع قرمز را در عکس پیدا می کند:
import cv2
import numpy as np
import matplotlib.pyplot as plt
print("=" * 50)
print(" برنامه تشخیص مربع قرمز - نسخه Pydroid 3")
print("=" * 50)
# ========================
# قسمت 1: ساخت تصویر با مربع قرمز
# ========================
# ایجاد تصویر سفید
width, height = 600, 400
background_color = (255, 255, 255) # سفید
img = np.full((height, width, 3), background_color, dtype=np.uint8)
# مشخصات مربع قرمز
square_color = (0, 0, 255) # قرمز در مدل BGR
square_thickness = -1 # پر شده
square_size = 120
start_x, start_y = 200, 120 # موقعیت گوشه بالا-چپ
# کشیدن مربع قرمز
end_x = start_x + square_size
end_y = start_y + square_size
cv2.rectangle(img, (start_x, start_y), (end_x, end_y), square_color, square_thickness)
# اضافه کردن چند شکل دیگر برای چالش بیشتر
cv2.circle(img, (450, 300), 60, (255, 0, 0), -1) # دایره آبی
cv2.rectangle(img, (50, 250), (150, 350), (0, 255, 0), -1) # مربع سبز
cv2.putText(img, "Find Red Square", (180, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2)
# ذخیره تصویر
filename = "image_with_red_square.png"
cv2.imwrite(filename, img)
print(f"

تصویر ساخته و ذخیره شد: {filename}")
print(f" مربع قرمز در موقعیت: X={start_x}, Y={start_y}")
# نمایش تصویر ساخته شده با matplotlib
plt.figure(figsize=(8, 5))
plt.subplot(1, 2, 1)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.title("تصویر ساخته شده")
plt.axis('off')
# ========================
# قسمت 2: خواندن و پردازش تصویر
# ========================
print("\n در حال پردازش تصویر برای تشخیص مربع قرمز...")
# خواندن همان فایل ذخیره شده
loaded_img = cv2.imread(filename)
if loaded_img is None:
print("

خطا: تصویر بارگذاری نشد!")
exit()
# تبدیل از BGR به HSV (برای تشخیص رنگ بهتر)
hsv_img = cv2.cvtColor(loaded_img, cv2.COLOR_BGR2HSV)
# تعریف محدوده رنگ قرمز در HSV
lower_red1 = np.array([0, 70, 50])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 70, 50])
upper_red2 = np.array([180, 255, 255])
# ایجاد ماسکهای قرمز
mask1 = cv2.inRange(hsv_img, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv_img, lower_red2, upper_red2)
red_mask = mask1 + mask2
# بهبود ماسک با مورفولوژی
kernel = np.ones((5, 5), np.uint8)
red_mask = cv2.morphologyEx(red_mask, cv2.MORPH_CLOSE, kernel)
red_mask = cv2.morphologyEx(red_mask, cv2.MORPH_OPEN, kernel)
# پیدا کردن کانتورها
contours, _ = cv2.findContours(red_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# تصویر برای نمایش نتیجه
result_img = loaded_img.copy()
detected_squares = []
print(f"\n تعداد مناطق قرمز شناسایی شده: {len(contours)}")
# بررسی هر کانتور
for i, contour in enumerate(contours):
x, y, w, h = cv2.boundingRect(contour)
area = cv2.contourArea(contour)
if area > 500:
aspect_ratio = float(w) / h if h != 0 else 0
if 0.8 <= aspect_ratio <= 1.2:
# کشیدن مستطیل سبز دور مربع شناسایی شده
cv2.rectangle(result_img, (x, y), (x + w, y + h), (0, 255, 0), 3)
# نوشتن متن روی مربع
cv2.putText(result_img, f"Square {len(detected_squares)+1}",
(x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
# نمایش اطلاعات در کنسول
print(f"\n

مربع قرمز {len(detected_squares)+1} شناسایی شد:")
print(f" موقعیت: X={x}, Y={y}")
print(f" اندازه: {w}x{h} پیکسل")
print(f" مساحت: {int(area)} پیکسل مربع")
print(f" نسبت ابعاد: {aspect_ratio:.2f}")
detected_squares.append((x, y, w, h))
# ========================
# قسمت 3: نمایش نتایج با matplotlib
# ========================
plt.subplot(1, 2, 2)
result_rgb = cv2.cvtColor(result_img, cv2.COLOR_BGR2RGB)
plt.imshow(result_rgb)
plt.title("نتیجه تشخیص")
plt.axis('off')
plt.tight_layout()
plt.show()
# ذخیره نتیجه
cv2.imwrite("detected_squares.png", result_img)
if detected_squares:
print(f"\n در مجموع {len(detected_squares)} مربع قرمز شناسایی شد!")
print(f"\n تصویر نتیجه ذخیره شد: detected_squares.png")
print("\n" + "=" * 50)
print("مقایسه با مربع اصلی:")
print(f"مربع رسم شده: X={start_x}, Y={start_y}")
print(f"مربع شناسایی شده: X={detected_squares[0][0]}, Y={detected_squares[0][1]}")
# دقت تشخیص
error_x = abs(detected_squares[0][0] - start_x)
error_y = abs(detected_squares[0][1] - start_y)
print(f"خطای تشخیص: X±{error_x}, Y±{error_y} پیکسل")
else:
print("

هیچ مربع قرمزی شناسایی شد!")
print("\n" + "=" * 50)
print("برنامه با موفقیت به پایان رسید!")