شرح برنامه پست قبل:
سالک: بزنامه را اجرا کردم ، چند جای پر نور را دایره می کشه و شماره می زنه نشاان میده....
سالک: البته برنامه ساده ای است و باید خیلی تکمیل بشه
ولی تلاش برای ایجاد یک روال آموزشی بود تا اینجا...بعدا برنامه های کارآمدتر می نویسیم.
شرح برنانه توسط deepseek :
خط به خط توضیح میدم:
---
تابع process_image خط به خط
```python
def process_image(image):
"""پیدا کردن LED با تفکیک نواحی"""
```
خط ۱-۲: تعریف تابع و توضیح. image تصویر رنگی RGB از دوربینه.
---
```python
result = image.copy()
```
خط ۴: یه کپی از تصویر میگیریم. دلیل: روی کپی کار کنیم، تصویر اصلی دستنخورده بمونه. عادت خوبیه!
---
```python
mask = (image[:,:,0] > 200) & (image[:,:,1] > 200) & (image[:,:,2] > 200)
```
خط ۷: ماسک سهکاناله:
· image[:,:,0] = همه پیکسلهای کانال قرمز (R)
· image[:,:,1] = همه پیکسلهای کانال سبز (G)
· image[:,:,2] = همه پیکسلهای کانال آبی (B)
· > 200 = کدوم پیکسلها روشنتر از ۲۰۰ هستن؟
· & = هر سه شرط باید همزمان برقرار باشه
نتیجه: mask یه آرایه دوبعدی از True/False میشه. True یعنی اون پیکسل توی هر سه کانال بالای ۲۰۰ بوده (پیکسل سفید و روشن).
---
```python
mask = mask.astype(np.uint8) * 255
```
خط ۹: تبدیل ماسک از True/False به 255/0:
· True → 255 (سفید)
· False → 0 (سیاه)
· astype(np.uint8) = تبدیل به اعداد ۸ بیتی (۰ تا ۲۵۵)
اینجوری cv2.findContours میتونه پردازشش کنه.
---
```python
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
```
خط ۱۲: پیدا کردن کانتورها (نواحی مجزا):
· cv2.RETR_EXTERNAL = فقط کانتورهای بیرونی رو بگیر (حفرهها رو نادیده بگیر)
· cv2.CHAIN_APPROX_SIMPLE = نقاط اضافی رو حذف کن (مثلاً خط صاف = فقط دو نقطه شروع و پایان)
· contours = لیستی از نواحی جدا از هم
· _ = خروجی دوم رو نیاز نداریم (سلسلهمراتب)
---
```python
led_count = 0
```
خط ۱۴: شمارنده LEDها، از صفر شروع میکنه.
---
```python
for cnt in contours:
```
خط ۱۶: حلقه روی هر کانتور (ناحیه روشن) که پیدا شده.
---
```python
if cv2.contourArea(cnt) > 5:
```
خط ۱۸: فیلتر نویز: مساحت کانتور بیشتر از ۵ پیکسل باشه. نویزهای ریز (۱-۲ پیکسل) رو حذف میکنه.
---
```python
x, y, w, h = cv2.boundingRect(cnt)
```
خط ۲۰: مستطیل محصورکننده:
· x, y = گوشه بالا-چپ مستطیل
· w = عرض مستطیل
· h = ارتفاع مستطیل
---
```python
center_x = x + w//2
center_y = y + h//2
```
خط ۲۲-۲۳: محاسبه مرکز مستطیل = مرکز ناحیه روشن.
---
```python
cv2.circle(result, (center_x, center_y), 20, (0, 255, 0), 2)
```
خط ۲۵: رسم دایره سبز دور مرکز LED:
· شعاع ۲۰ پیکسل
· رنگ سبز (0, 255, 0)
· ضخامت ۲
---
```python
cv2.putText(result, f"LED {led_count+1}", (center_x-30, center_y-30),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
```
خط ۲۶-۲۷: نوشتن شماره LED بالای دایره (LED 1, LED 2, ...)
---
```python
led_count += 1
```
خط ۲۹: یکی به شمارنده اضافه کن.
---
```python
cv2.putText(result, f"Total: {led_count} LEDs", (10, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
```
خط ۳۲-۳۳: نوشتن تعداد کل LEDهای پیدا شده گوشه بالا-چپ تصویر.
```
سالک: قسمت نمایش عکس را دیگه شرح ندادیم و کدش را اینجا نیاوردیم چون تکراری بود.
---
خلاصه کاری که میکنه:
1. پیکسلهای روشن (سفید) رو پیدا کن
2. نواحی جدا از هم رو تشخیص بده
3. نویزهای ریز رو حذف کن
4. هر ناحیه رو علامتگذاری و شمارهگذاری کن
5. تعداد کل رو نشون بده