نکات opencv بعد دیدن فیلمها

saalek110

Well-Known Member
نکات opencv بعد دیدن فیلمها


سالک: من فیلمها را دیدم ،
فیلمهای اون ۳ نفر را منظورمه.....
که مجموعه فیلم داشتند و در تاپیک فیلمها لینکشون را زدم......


یک سری سوال برام پیش اومد که از هوش مصنوعی پرسیدم و در این تاپیک می زنم.


پستهای این تاپیک شاید جابجا و نامرتب باشه ولی مهم نیست ، خودتان در ذهن خودتان نظم بدهید،
مهم اینه یک پاورقی بر فیلم ها نوشته بشه.
 
آخرین ویرایش:

saalek110

Well-Known Member
در مجموعه اول ، مجموعه آقای ابراهیمی ، فیلم های اولش یک سری مفاهیم داشت که مفیده گوش بدهید.

نکنه دوم اینکه با برنامه های ساده مثل خوندن و نمایش عکس اول شروع کنید.
 

saalek110

Well-Known Member
سالک: دستور print کارش چیه؟ کجا چاپ می کنه؟


آهان! فهمیدم! می‌خوای پایه‌ها رو قوی کنی. ببین:

## **`print()` در OpenCV کجا چاپ میشه؟**

**جواب کوتاه:** در **کنسول (Terminal) یا محیط اجرای پایتون** چاپ میشه، نه در پنجره OpenCV!

## ️ **مثال واضح:**

```python
import cv2
import numpy as np

print("✨ این متن توی ترمینال میاد! ✨")
print("دقیقاً همونجایی که کد رو اجرا کردی")

# عکس رو بساز
img = np.zeros((300, 500, 3), dtype=np.uint8) # عکس سیاه
img[100:200, 200:300] = [0, 0, 255] # مربع قرمز

# این رو روی عکس بنویس (نه print!)
cv2.putText(img, "این روی عکس نوشته میشه",
(50, 50), # موقعیت (x, y)
cv2.FONT_HERSHEY_SIMPLEX, # فونت
0.7, # اندازه
(255, 255, 255), # رنگ سفید
2) # ضخامت

print(" ابعاد عکس:", img.shape) # اینم توی ترمینال

cv2.imshow("پنجره OpenCV", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

print(" برنامه تموم شد!") # اینم توی ترمینال
```

## **تفاوت `print()` و `cv2.putText()`:**

| | **`print()`** | **`cv2.putText()`** |
| :--- | :--- | :--- |
| **جای نمایش** | ترمینال/کنسول | روی عکس در پنجره OpenCV |
| **هدف** | دیباگ کردن، اطلاعات | نوشتن روی عکس برای کاربر |
| **مثال** | `print("تشخیص داده شد")` | `cv2.putText(img, "Cup", ...)` |
| **کاربر می‌بینه؟** | خیر (مگر ترمینال باز باشه) | آری (روی عکس) |

## **مثال واقعی برای پروژه لیوان:**

```python
import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while True:
ret, frame = cap.read()
if not ret:
print("❌ خطا در خواندن از دوربین!") # ترمینال
break

# پردازش برای پیدا کردن لیوان
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_white = np.array([0, 0, 180])
upper_white = np.array([180, 50, 255])
mask = cv2.inRange(hsv, lower_white, upper_white)

# پیدا کردن کانتورها
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

cup_count = 0
for cnt in contours:
area = cv2.contourArea(cnt)
if area > 1000:
cup_count += 1
x, y, w, h = cv2.boundingRect(cnt)

# ۱. روی عکس بنویس (کاربر می‌بینه)
cv2.putText(frame, f"Cup {cup_count}", (x, y-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

# ۲. در ترمینال چاپ کن (برای دیباگ)
print(f"لیوان {cup_count}: x={x}, y={y}, area={area}")

# ۳. روی عکس تعداد رو بنویس
cv2.putText(frame, f"Total Cups: {cup_count}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

# ۴. در ترمینال هم چاپ کن
if cup_count > 0:
print(f"✅ {cup_count} لیوان تشخیص داده شد!")
else:
print("⏳ در حال جستجو برای لیوان...")

cv2.imshow('Cup Detection', frame)

key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
print(" کاربر خواست خارج شود...") # ترمینال
break

cap.release()
cv2.destroyAllWindows()
print(" برنامه بسته شد.") # ترمینال
```

## **چه چیزهایی رو با `print()` چاپ کنی؟**

```python
# ۱. اطلاعات دیباگ
print("شروع برنامه...")
print(f"ابعاد فریم: {frame.shape}")
print(f"تعداد کانتورها: {len(contours)}")

# ۲. مقادیر متغیرها
print(f"مساحت: {area}, موقعیت: ({x}, {y})")

# ۳. خطاها
if frame is None:
print("خطا: عکس بارگیری نشد!")

# ۴. پیشرفت برنامه
print("مرحله ۱: تبدیل به HSV انجام شد")
print("مرحله ۲: ساخت ماسک انجام شد")
print("مرحله ۳: پیدا کردن کانتورها...")

# ۵. نتایج نهایی
print(f"✅ عملیات موفق! {cup_count} لیوان پیدا شد.")
```

## **تمرین کوچیک:**

```python
import cv2
import numpy as np

# یک عکس ساده بساز
img = np.ones((200, 400, 3), dtype=np.uint8) * 100 # خاکستری

print(" این متن فقط در ترمینال میاد!")
print("عکس ساخته شد. ابعاد:", img.shape)

# این روی عکس نوشته میشه:
cv2.putText(img, "سلام OpenCV!", (50, 100),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)

print("حالا پنجره OpenCV باز میشه...")

cv2.imshow("تمرین", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

print("پنجره بسته شد!")
print("برو ببین ترمینال رو، همه printها اونجان! ")
```

## **نکته مهم:**
- برنامه رو از **Command Line** یا **Terminal** اجرا کن تا printها رو ببینی
- اگر از VS Code استفاده می‌کنی، printها توی **پنل Terminal** پایین میاد
- اگر از PyCharm استفاده می‌کنی، printها توی **Run window** میاد

**پس به طور خلاصه:**
- `print()` → برای **خودت** (دیباگ، اطلاعات)
- `cv2.putText()` → برای **کاربر** (نمایش روی عکس)
 

saalek110

Well-Known Member
سالک: ماسک یعنی چه؟


حتماً! در OpenCV (و به طور کلی در پردازش تصویر) **ماسک (Mask)** یک مفهوم بسیار ساده اما قدرتمند است.

در واقع، **ماسک مانند یک شابلون یا استنسیل فیزیکی است که روی تصویر میگذارید** تا فقط بخشهای خاصی از آن دیده یا پردازش شود.

---

### مثال ساده از دنیای واقعی:
فرض کنید یک عکس دارید و میخواهید فقط صورت فرد در آن عکس معلوم باشد و بقیهٔ پس‌سیاه (مشکی) باشد.
یک کاغذ مقوایی برمیدارید، فقط قسمتی که صورت را نشان میدهد را برش میدهید (سوراخ میکنید) و آن را روی عکس قرار میدهید.
حالا فقط از طریق سوراخِ مقوا، صورت دیده میشود و بقیهٔ عکس پشت مقوای ساده پنهان است.
این مقوای سوراخ‌دار **همان ماسک** است.

---

### در OpenCV (دیجیتالی) چطور کار میکند؟
ماسک در OpenCV یک **تصویر سیاه‌وسفید (تک‌کاناله)** است که اندازه‌اش با تصویر اصلی یکی است.

- **پیکسل‌های سفید (مقدار ۲۵۵)** = "اجازه عبور میدهند" → آن ناحیه از تصویر اصلی **نمایش/پردازش** میشود.
- **پیکسل‌های سیاه (مقدار ۰)** = "مسدود میکنند" → آن ناحیه از تصویر اصلی **پنهان/نادیده گرفته** میشود.

مثال کد (پایتون):

```python
import cv2
import numpy as np

# خواندن تصویر اصلی
image = cv2.imread('image.jpg')

# ایجاد یک ماسک خالی (سیاه) با همان اندازه
mask = np.zeros(image.shape[:2], dtype=np.uint8)

# رسم یک دایره سفید روی ماسک (مثلاً نشان دهنده ناحیه مورد علاقه)
cv2.circle(mask, center=(300, 300), radius=100, color=255, thickness=-1)

# اعمال ماسک روی تصویر
masked_image = cv2.bitwise_and(image, image, mask=mask)

# حالا فقط قسمت دایره‌ای تصویر اصلی دیده می‌شود، بقیه سیاه است.
```

---

### کاربردهای رایج ماسک در OpenCV:
۱. **جداساشی یک شیء از پس‌زمینه** (مثلاً فقط خودرو را در تصویر نگه دارید).
۲. **محدود کردن پردازش به یک منطقه خاص** (مثلاً فقط درون یک مستطیل به جستجوی لبه‌ها بپردازید).
۳. **ترکیب انتخابی دو تصویر** (مثلاً جایگزین کردن آسمان در عکس فقط در مناطق خاص).
۴. **حذف نویز از نواحی غیر مهم**.

---

### جمع‌بندی به زبان خیلی ساده:
**ماسک یک تصویر سیاه‌وسفید هست که مانند یک قالب برش، مشخص می‌کند کدام قسمت‌های تصویر اصلی "معلوم" باشند و کدام قسمت‌ها "پنهان" یا "نادیده گرفته" شوند.**
 

saalek110

Well-Known Member
شرح یک سری توابع:


# توابع پردازش تصویر در OpenCV (Pixel-level Operations)

## 1. **خواندن و نوشتن تصویر**
```python
import cv2

# خواندن تصویر
img = cv2.imread('image.jpg') # BGR format

# ذخیره تصویر
cv2.imwrite('output.jpg', img)
```

## 2. **دسترسی و تغییر پیکسل‌ها**
```python
# دسترسی به مقدار پیکسل
pixel_value = img[y, x] # [B, G, R]

# تغییر پیکسل خاص
img[y, x] = [255, 0, 0] # آبی

# دسترسی به کانال‌های رنگی
blue = img[y, x, 0]
green = img[y, x, 1]
red = img[y, x, 2]
```

## 3. **تبدیل فضای رنگی**
```python
# BGR به Grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# BGR به HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# BGR به RGB
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
```

## 4. **تغییر روشنایی و کنتراست**
```python
# روشنایی و کنتراست
alpha = 1.5 # کنتراست (1.0 = نرمال)
beta = 50 # روشنایی (0 = بدون تغییر)

adjusted = cv2.convertScaleAbs(img, alpha=alpha, beta=beta)
```

## 5. **عملیات آستانه‌گذاری (Thresholding)**
```python
# آستانه‌گذاری ساده
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# آستانه‌گذاری تطبیقی
adaptive = cv2.adaptiveThreshold(gray, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)

# آستانه‌گذاری Otsu
_, otsu = cv2.threshold(gray, 0, 255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU)
```

## 6. **عملیات مورفولوژیک**
```python
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))

# فرسایش
eroded = cv2.erode(img, kernel)

# انبساط
dilated = cv2.dilate(img, kernel)

# باز کردن
opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

# بستن
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
```

## 7. **فیلترهای تصویری**
```python
# فیلتر گوسی (تار کردن)
blur = cv2.GaussianBlur(img, (5,5), 0)

# فیلتر میانه
median = cv2.medianBlur(img, 5)

# فیلتر سوبل (لبه‌یابی)
sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5)
```

## 8. **عملیات حسابی روی پیکسل‌ها**
```python
# جمع دو تصویر
added = cv2.add(img1, img2)

# تفریق دو تصویر
subtracted = cv2.subtract(img1, img2)

# ضرب اسکالر
multiplied = cv2.multiply(img, 1.5)

# ترکیب وزنی
blended = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
```

## 9. **تشخیص لبه**
```python
# Canny Edge Detection
edges = cv2.Canny(gray, 100, 200) # threshold1, threshold2

# Laplacian
laplacian = cv2.Laplacian(gray, cv2.CV_64F)
```

## 10. **تغییر اندازه و چرخش**
```python
# تغییر اندازه
resized = cv2.resize(img, (new_width, new_height))

# چرخش
rows, cols = img.shape[:2]
M = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1) # 45 درجه
rotated = cv2.warpAffine(img, M, (cols, rows))
```

## 11. **رسم روی تصویر**
```python
# خط
cv2.line(img, (x1,y1), (x2,y2), (0,255,0), thickness=2)

# مستطیل
cv2.rectangle(img, (x1,y1), (x2,y2), (255,0,0), thickness=2)

# دایره
cv2.circle(img, (center_x, center_y), radius, (0,0,255), thickness=-1)

# متن
cv2.putText(img, 'Hello', (x,y),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2)
```

## 12. **عملیات بیتی**
```python
# AND بیتی
bitwise_and = cv2.bitwise_and(img1, img2)

# OR بیتی
bitwise_or = cv2.bitwise_or(img1, img2)

# NOT بیتی
bitwise_not = cv2.bitwise_not(img)

# XOR بیتی
bitwise_xor = cv2.bitwise_xor(img1, img2)
```

## 13. **تقسیم و ادغام کانال‌ها**
```python
# تقسیم کانال‌ها
b, g, r = cv2.split(img)

# ادغام کانال‌ها
merged = cv2.merge([b, g, r])

# ایجاد تصویر تک کاناله
zeros = np.zeros(img.shape[:2], dtype="uint8")
red_only = cv2.merge([zeros, zeros, r])
```

## 14. **هیستوگرام**
```python
# محاسبه هیستوگرام
hist = cv2.calcHist([gray], [0], None, [256], [0,256])

# تساوی هیستوگرام
equalized = cv2.equalizeHist(gray)

# CLAHE (Contrast Limited Adaptive Histogram Equalization)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
clahe_img = clahe.apply(gray)
```

## نکات مهم:
1. تصاویر در OpenCV به صورت **BGR** ذخیره می‌شوند (نه RGB)
2. مختصات به صورت **(x, y)** هستند (نه y, x)
3. برای کارایی بهتر از عملیات برداری استفاده کنید نه حلقه‌های تکی
4. از NumPy برای عملیات پیچیده‌تر روی پیکسل‌ها استفاده کنید

این توابع پایه‌ای برای کار با پیکسل‌ها در OpenCV هستند که می‌توانند برای پردازش تصویر، بینایی کامپیوتر و کاربردهای یادگیری ماشین استفاده شوند.
 

saalek110

Well-Known Member

سلام! برای نوآموزان OpenCV، گروه‌های اصلی توابع را می‌توان به چند دسته کلی تقسیم کرد. این دسته‌بندی به شما کمک می‌کند تا یادگیری را ساختارمند شروع کنید:

## 1. **توابع خواندن و نوشتن تصویر (I/O Operations)**
- **خواندن تصویر**: `cv2.imread()`
- **نمایش تصویر**: `cv2.imshow()`, `cv2.waitKey()`, `cv2.destroyAllWindows()`
- **ذخیره تصویر**: `cv2.imwrite()`
- **خواندن ویدیو**: `cv2.VideoCapture()`
- **ذخیره ویدیو**: `cv2.VideoWriter()`

## 2. **توابع پردازش اولیه تصویر (Basic Image Processing)**
- **تغییر اندازه**: `cv2.resize()`
- **برش تصویر**: تصویر indexing (مثل `image[y1:y2, x1:x2]`)
- **چرخش**: `cv2.rotate()`
- **تغییر رنگ‌ها**: `cv2.cvtColor()` (مثل تبدیل BGR به RGB یا Grayscale)
- **ترکیب تصاویر**: `cv2.add()`, `cv2.addWeighted()`

## 3. ️ **ترسیم اشکال و متن (Drawing Functions)**
- **خط**: `cv2.line()`
- **مستطیل**: `cv2.rectangle()`
- **دایره**: `cv2.circle()`
- **بیضی**: `cv2.ellipse()`
- **نوشتن متن**: `cv2.putText()`
- **چندضلعی**: `cv2.polylines()`

## 4. **تبدیل‌های تصویری (Image Transformations)**
- **تبدیل‌های هندسی**: `cv2.warpAffine()`, `cv2.warpPerspective()`
- **چرخش پیشرفته**: `cv2.getRotationMatrix2D()`
- **تبدیل‌های فضایی**: `cv2.resize()` با interpolationهای مختلف

## 5. **فیلترها و آستانه‌گذاری (Filters & Thresholding)**
- **فیلترهای هموارسازی**: `cv2.blur()`, `cv2.GaussianBlur()`, `cv2.medianBlur()`
- **فیلتر لبه‌یابی**: `cv2.Sobel()`, `cv2.Canny()`
- **آستانه‌گذاری**:
- `cv2.threshold()` (آستانه ساده)
- `cv2.adaptiveThreshold()` (آستانه سازگار)

## 6. **تشخیص و ردیابی (Detection & Tracking)**
- **تشخیص لبه**: `cv2.Canny()`
- **تشخیص گوشه**: `cv2.cornerHarris()`, `cv2.goodFeaturesToTrack()`
- **تشخیص کانتور**: `cv2.findContours()`, `cv2.drawContours()`
- **تبدیل Hough**: `cv2.HoughLines()`, `cv2.HoughCircles()`

## 7. **تاریخچه و ویژگی‌ها (Histograms & Features)**
- **تاریخچه**: `cv2.calcHist()`, `cv2.equalizeHist()`
- **الگوهای دودویی محلی**: `cv2.LBP()` (در OpenCV-contrib)
- **تطبیق الگو**: `cv2.matchTemplate()`

## 8. ⚙️ **ابزارهای کاربردی (Utility Functions)**
- **اطلاعات تصویر**: `.shape`, `.dtype`, `.size`
- **ایجاد تصویر خالی**: `np.zeros()`, `np.ones()`
- **فاصله و اندازه‌گیری**: `cv2.moments()`, `cv2.contourArea()`, `cv2.arcLength()`

## **پیشنهاد شروع برای نوآموزان:**

1. **ابتدا با گروه 1 و 2** کار کنید تا با مفاهیم اولیه آشنا شوید
2. **سپس گروه 3** را تمرین کنید تا بتوانید روی تصاویر علامت‌گذاری کنید
3. **گروه 5** را برای پردازش‌های کاربردی یاد بگیرید
4. **گروه 6** برای پروژه‌های جذاب مانند تشخیص شکل‌ها

## مثال ساده برای شروع:
```python
import cv2
import numpy as np

# خواندن تصویر
img = cv2.imread('image.jpg')

# تبدیل به خاکستری
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# نمایش تصویر
cv2.imshow('Original', img)
cv2.imshow('Gray', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
 

saalek110

Well-Known Member
سالک: نمی دونم پست زیر را در بالا زدم یا نه ، ولی تکرارش ضرر نداره:



بسیار خب! اینم لیست توابع رایج OpenCV با توضیح ساده:

**خواندن و نوشتن:**
- `cv2.imread()` - عکس رو از فایل می‌خونه
- `cv2.imwrite()` - عکس رو در فایل ذخیره می‌کنه
- `cv2.imshow()` - عکس رو توی پنجره نمایش می‌ده
- `cv2.waitKey()` - منتظر فشار دادن کلید می‌مونه
- `cv2.destroyAllWindows()` - همه پنجره‌ها رو می‌بنده
- `cv2.VideoCapture()` - از دوربین یا ویدیو می‌خونه
- `cap.read()` - یک فریم از دوربین می‌گیره
- `cap.release()` - دوربین رو آزاد می‌کنه

**پردازش اولیه:**
- `cv2.resize()` - اندازه عکس رو تغییر می‌ده
- `cv2.cvtColor()` - رنگ عکس رو تبدیل می‌کنه (مثلاً به خاکستری یا HSV)
- `cv2.GaussianBlur()` - عکس رو محو می‌کنه تا نویز کم بشه
- `img.shape` - اندازه عکس رو می‌ده (ارتفاع، عرض، کانال‌ها)

**کار با رنگ:**
- `cv2.inRange()` - پیکسل‌های یک محدوده رنگ رو انتخاب می‌کنه (ماسک می‌سازه)
- `cv2.bitwise_and()` - دو عکس رو با هم AND می‌کنه (برای اعمال ماسک)
- `cv2.bitwise_not()` - معکوس یک عکس یا ماسک رو می‌گیره

**تشخیص لبه و شکل:**
- `cv2.Canny()` - لبه‌های عکس رو پیدا می‌کنه
- `cv2.findContours()` - شکل‌های بسته رو پیدا می‌کنه
- `cv2.drawContours()` - شکل‌های پیدا شده رو روی عکس می‌کشه
- `cv2.contourArea()` - مساحت یک شکل رو حساب می‌کنه
- `cv2.arcLength()` - محیط یک شکل رو حساب می‌کنه

**آنالیز شکل:**
- `cv2.boundingRect()` - کوچکترین مستطیل دور یک شکل رو می‌ده
- `cv2.minAreaRect()` - کوچکترین مستطیل چرخیده دور شکل رو می‌ده
- `cv2.moments()` - ممان‌های شکل رو حساب می‌کنه (برای پیدا کردن مرکز)
- `cv2.approxPolyDP()` - شکل رو به چندضلعی ساده‌تر تقریب می‌زنه

**رسم کردن:**
- `cv2.rectangle()` - مستطیل می‌کشه
- `cv2.circle()` - دایره می‌کشه
- `cv2.line()` - خط می‌کشه
- `cv2.putText()` - متن روی عکس می‌نویسه

**عملیات مورفولوژی:**
- `cv2.morphologyEx()` - عملیات روی شکل‌ها انجام می‌ده
- `cv2.erode()` - شکل‌ها رو فرسایش می‌ده (کوچک‌تر می‌کنه)
- `cv2.dilate()` - شکل‌ها رو اتساع می‌ده (بزرگ‌تر می‌کنه)

**مقادیر پرکاربرد:**
- `cv2.RETR_EXTERNAL` - فقط شکل‌های بیرونی رو بگیر
- `cv2.CHAIN_APPROX_SIMPLE` - شکل رو ساده کن
- `cv2.COLOR_BGR2GRAY` - تبدیل BGR به خاکستری
- `cv2.COLOR_BGR2HSV` - تبدیل BGR به HSV
- `cv2.THRESH_BINARY` - آستانه‌گذاری باینری

این ۳۵-۴۰ تابع برای ۹۰٪ کارهای OpenCV کافیه!
 

saalek110

Well-Known Member
سالک: بعد یافتن کانتورها ، چه کارهایی می توانیم بکنیم؟
مطلب زیر را به عموان فوق برنامه و علاقه مندی بخوانید.



عالی! بعد از پیدا کردن کانتورها (Contours) در OpenCV، دنیایی از امکانات پیش روی شماست. کانتورها اساساً مرزهای اشیاء را در تصویر مشخص می‌کنند و با آنها می‌توان کارهای متنوعی انجام داد:

## **تحلیل و اندازه‌گیری**
- **مساحت و محیط**: `cv2.contourArea()` و `cv2.arcLength()`
- **مرکز جرم**: `cv2.moments()`
- **محدوده (Bounding Box)**:
```python
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2)
```
- **محدوده چرخانده‌شده (Rotated Rectangle)**:
```python
rect = cv2.minAreaRect(contour)
box = cv2.boxPoints(rect)
```

## **تشخیص شکل**
- **تخمین شکل**: با `cv2.approxPolyDP()`
- **تشخیص دایره/مربع/مثلث**:
```python
peri = cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, 0.04*peri, True)

if len(approx) == 3:
shape = "مثلث"
elif len(approx) == 4:
shape = "چهارضلعی"
else:
shape = "دایره"
```

## ️ **ترسیم و بصری‌سازی**
- **رسم کانتورها**: `cv2.drawContours()`
- **پر کردن اشیاء**: `cv2.drawContours()` با thickness=-1
- **ماسک‌گیری**: استخراج بخش خاصی از تصویر

## **فیلتر و انتخاب**
- **حذف نویز**: فیلتر بر اساس مساحت
```python
filtered_contours = [c for c in contours
if cv2.contourArea(c) > min_area]
```
- **مرتب‌سازی**: بر اساس مساحت، موقعیت، یا اندازه

## **کاربردهای عملی**

### 1. **شمارش اشیاء**
```python
num_objects = len(contours)
print(f"تعداد اشیاء: {num_objects}")
```

### 2. **اندازه‌گیری ابعاد** (با کالیبراسیون)
```python
# با دانستن اندازه واقعی یک مرجع
pixel_per_cm = known_width / contour_width
real_width = w / pixel_per_cm
real_height = h / pixel_per_cm
```

### 3. **تشخیص نقاط عطف**
```python
# نقاط انتهایی
leftmost = tuple(contour[contour[:,:,0].argmin()][0])
rightmost = tuple(contour[contour[:,:,0].argmax()][0])
topmost = tuple(contour[contour[:,:,1].argmin()][0])
bottommost = tuple(contour[contour[:,:,1].argmax()][0])
```

### 4. **تشخیص حضور/عدم حضور اشیاء**
```python
def check_object_presence(contours, threshold=100):
if len(contours) > 0:
largest = max(contours, key=cv2.contourArea)
if cv2.contourArea(largest) > threshold:
return True
return False
```

### 5. **ردیابی حرکت ساده**
```python
# مقایسه موقعیت کانتورها در فریم‌های متوالی
for i, contour in enumerate(contours):
M = cv2.moments(contour)
if M["m00"] != 0:
cx = int(M["m10"] / M["m00"])
cy = int(M["m01"] / M["m00"])
# مقایسه با موقعیت قبلی
```

### 6. **برچسب‌گذاری و آنالیز**
```python
# برچسب‌گذاری هر شیء
for i, contour in enumerate(contours):
cv2.putText(image, f"Object {i+1}",
(x, y-10), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (255,0,0), 2)
```

## **نکات مهم**:
- کانتورها را همیشه بر اساس مساحت فیلتر کنید تا نویز حذف شود
- از `cv2.approxPolyDP` برای ساده‌سازی کانتورهای پیچیده استفاده کنید
- برای کانتورهای توخالی، از `cv2.findContours()` با mode مناسب استفاده کنید
- حتماً کانتورها را روی کپی تصویر اصلی رسم کنید

**مثال کاربردی**: اگر اشیاء خاصی (مثلاً پیچ یا قطعات صنعتی) را در خط تولید دارید، می‌توانید:
1. تعداد را بشمارید
2. اندازه‌ها را چک کنید
3. شکل‌ها را تأیید کنید
4. مکان هر شیء را مشخص کنید

آیا پروژه خاصی در ذهن دارید؟ می‌توانم کدهای کامل‌تری برای کاربرد مورد نظر شما ارائه دهم!
 

saalek110

Well-Known Member
تعریف کانتور نقاط هم رنگ است.....
ولی همرنگ یعنی چی؟

قرمز هزاران عدد داره ، پس نقاط قرمز را نمیشه مساوی در نظر گرفت


برای همین اول شکل را خاکستری می کنند gray که اعداد صفر تا ۲۵۵ بشه محدوده اعداد....
تصویر رنگی سه کانال است یعنی سه سری اعداد برای سه رنگ اصلی داره ولی تصویر خاکستری تک کانال است

بعد خاکستری کردن ، میان سیاه و سفید می کنند . که یا صفر میشه یا یک....

روی تصویر سیاه و سفید کانتور پیدا می کنند.
این جوری حجم پردازش و فشار به پردازنده کم میشه .....


سالک: ممکنه کانتور یابی روی تصاویر غیر سیاه سفید هم باشه ولی در فیلمها ، مرحله خاکستری کردن و سیاه سفید کردن هست ، و اینجا خواستم بفهمید اون کارها قبل کانتوریابی چی بود...


تابع ترشولد فکر کنم خاکستری را سیاه و سفید می کرد...الان برنامه جلوم نیست. بله تابع سیاه و سفید کن ، فکر کنم تابع ترشولد بود....


تشخیص یک رنگ خاص:
برای یافتن یک کاغذ رنگی هم باید انواع زرد را اعدادش را داد ، حدپایین و حد بالای زرد را مشخص کرد تا بگیم اون کاغذ زرده ، شاید با همین تابع ترشولد یا یک تابع دیگر ، الان کدها جلوم نیست...حد پایین زرد و حد بالای زرد را به اون تابع می دهیم تا نقاط زرد را پیدا کنه....پست بعدی را نگاه کنید ، حد بالا و پایین زرد را فکر کنم برای ماسکه کردن استفاده کرده.
سالک: من خودم فعلا نوآموزم در این حیطه و شاید اشتباه گفته باشم.
 
آخرین ویرایش:

saalek110

Well-Known Member
در کد پایین که از هوش مصنوعی deepseek گرفتم . حد پایین و بالای رنگ زرد را داده به ماسک....
سالک: فکر کنم هر چی به جز رنگ زرد بوده را ماسکه کرده و ندیده گرفته.



import cv2
import numpy as np

# 1. تعریف محدوده رنگ زرد در فضای HSV
# این مقادیر برای زرد "متداول" مناسب هستند
lower_yellow = np.array([20, 100, 100]) # حد پایین رنگ زرد
upper_yellow = np.array([30, 255, 255]) # حد بالای رنگ زرد

# 2. تابع تشخیص رنگ زرد
def detect_yellow_color(image_path):
# خواندن تصویر
img = cv2.imread(image_path)
if img is None:
print("خطا: تصویر بارگذاری نشد!")
return

# تبدیل BGR به HSV (فضای رنگی بهتر برای جداسازی رنگ)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# ایجاد ماسک برای رنگ زرد
mask = cv2.inRange(hsv, lower_yellow, upper_yellow)

# اعمال ماسک روی تصویر اصلی
result = cv2.bitwise_and(img, img, mask=mask)

# نمایش نتایج
cv2.imshow('Original Image', img)
cv2.imshow('Yellow Mask (Black & White)', mask)
cv2.imshow('Only Yellow Parts', result)

# محاسبه درصد رنگ زرد در تصویر
yellow_pixels = np.count_nonzero(mask)
total_pixels = mask.shape[0] * mask.shape[1]
percentage = (yellow_pixels / total_pixels) * 100
print(f"درصد رنگ زرد در تصویر: {percentage:.2f}%")

cv2.waitKey(0)
cv2.destroyAllWindows()

# 3. اجرای تابع
detect_yellow_color('path/to/your/image.jpg')
 

جدیدترین ارسال ها

بالا