import cv2
import matplotlib.pyplot as plt
import numpy as np
import time
# تابع ۱: گرفتن فریم از دوربین
def capture_frame(camera):
"""دریافت یک فریم از دوربین"""
ret, frame = camera.read()
if ret:
return frame
return None
# تابع ۲: تبدیل رنگ برای نمایش صحیح
def convert_color(image):
"""تبدیل BGR به RGB برای نمایش در matplotlib"""
return cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# تابع ۳: پردازش تصویر (خالی برای اضافه کردن پردازشهای بعدی)
def process_image(image):
"""فقط نمایش تصویر"""
plt.clf()
plt.imshow(image)
plt.title("Camera Feed - Click to Exit")
plt.axis('off')
plt.pause(0.001)
# تابع ۴: تنظیمات نمایش تصویر
def setup_plot():
"""آمادهسازی اولیه matplotlib"""
plt.ion()
fig, ax = plt.subplots(figsize=(10, 8))
fig.canvas.manager.set_window_title('Camera - Click to Exit')
def on_click(event):
print("\nخروج از برنامه...")
plt.close('all')
fig.canvas.mpl_connect('button_press_event', on_click)
return fig, ax
# تابع ۵: راهاندازی دوربین
def initialize_camera():
"""راهاندازی دوربین"""
camera = cv2.VideoCapture(0)
if not camera.isOpened():
print("خطا در باز کردن دوربین")
return None
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
return camera
# تابع ۶: حلقه اصلی
def main_loop(camera, ax):
"""حلقه اصلی برنامه"""
print("برنامه شروع شد. برای خروج روی تصویر کلیک کنید.")
try:
while plt.fignum_exists(1):
# گرفتن فریم
frame = capture_frame(camera)
if frame is not None:
# تبدیل رنگ
rgb_frame = convert_color(frame)
# پردازش
processed = process_image(rgb_frame)
except Exception as e:
print(f"خطا: {e}")
finally:
camera.release()
plt.close('all')
print("برنامه پایان یافت.")
# تابع اصلی اجرا
def run_camera_app():
"""اجرای کل برنامه"""
camera = initialize_camera()
if camera is None:
return
fig, ax = setup_plot()
main_loop(camera, ax)
# اجرای برنامه
if __name__ == "__main__":
run_camera_app()
import cv2
import matplotlib.pyplot as plt
import numpy as np
import time
# تابع ۱: گرفتن فریم از دوربین
def capture_frame(camera):
"""Getting frame from camera"""
ret, frame = camera.read()
if ret:
return frame
return None
# تابع ۲: تبدیل رنگ برای نمایش صحیح
def convert_color(image):
"""Convert BGR to RGB for matplotlib"""
return cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# تابع ۳: پردازش تصویر (خالی برای اضافه کردن پردازشهای بعدی)
def process_image(image):
"""فقط نمایش تصویر"""
plt.clf()
plt.imshow(image)
plt.title("Camera Feed - Click to Exit")
plt.axis('off')
plt.pause(0.001)
# تابع ۴: تنظیمات نمایش تصویر
def setup_plot():
"""Setup matplotlib display"""
plt.ion()
fig, ax = plt.subplots(figsize=(10, 8))
fig.canvas.manager.set_window_title('Camera - Click to Exit')
def on_click(event):
plt.close('all')
fig.canvas.mpl_connect('button_press_event', on_click)
return fig, ax
# نوار وضعیت پایین تصویر
height, width = image.shape[:2]
# پسزمینه نوار وضعیت
status_text_full = f"Frame: {frame_count} | {status_text} | Click to Exit"
ax.text(0.5, 0.02, status_text_full,
transform=ax.transAxes,
fontsize=12,
color='white',
ha='center',
va='bottom',
bbox=dict(boxstyle="round,pad=0.5", facecolor='black', alpha=0.8))
ax.axis('off')
plt.pause(0.001)
# تابع ۶: راهاندازی دوربین
def initialize_camera():
"""Initialize camera"""
camera = cv2.VideoCapture(0)
if not camera.isOpened():
return None
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
return camera
# تابع ۷: حلقه اصلی
def main_loop(camera, ax):
"""Main loop"""
frame_count = 0
status = "Camera Ready"
try:
while plt.fignum_exists(1):
# گرفتن فریم
frame = capture_frame(camera)
if frame is not None:
# تبدیل رنگ
rgb_frame = convert_color(frame)
# پردازش
processed = process_image(rgb_frame)
# شمارش فریمها
frame_count += 1
status = "Running..."
else:
status = "No Frame!"
show_frame(ax, np.zeros((480, 640, 3), dtype=np.uint8), status, frame_count)
except Exception as e:
# نمایش خطا روی تصویر
error_frame = np.zeros((480, 640, 3), dtype=np.uint8)
show_frame(ax, error_frame, f"Error!", frame_count)
finally:
camera.release()
plt.close('all')
# تابع اصلی اجرا
def run_camera_app():
"""Run the application"""
camera = initialize_camera()
if camera is None:
# اگر دوربین باز نشد، خطا روی تصویر
fig, ax = setup_plot()
error_frame = np.zeros((480, 640, 3), dtype=np.uint8)
show_frame(ax, error_frame, "Camera Not Found!", 0)
plt.show()
return
fig, ax = setup_plot()
main_loop(camera, ax)
# اجرای برنامه
if __name__ == "__main__":
run_camera_app()
# تابع ۴: پردازش تصویر - نوشتن Hello روی تصویر
def process_image(image):
"""Image processing - add Hello text"""
# موقعیت متن: گوشه بالا چپ
position = (50, 100)
# نوشتن Hello روی تصویر
cv2.putText(image, "Hello", position, cv2.FONT_HERSHEY_SIMPLEX,
3, (0, 255, 0), 4)
def process_image(image):
"""Image processing - add Hello text"""
# موقعیت متن: گوشه بالا چپ
position = (50, 100)
# نوشتن Hello روی تصویر
cv2.putText(image, "Hello", position, cv2.FONT_HERSHEY_SIMPLEX,
3, (0, 255, 0), 4)
#ghesmate namayesh tasvir
plt.clf()
plt.imshow(image)
plt.title("Camera Feed - Click to Exit")
plt.axis('off')
plt.pause(0.001)
"""Image processing - add Hello text"""
# موقعیت متن: گوشه بالا چپ
position = (50, 100)
# نوشتن Hello روی تصویر
cv2.putText(image, "Hello", position, cv2.FONT_HERSHEY_SIMPLEX,
3, (0, 255, 0), 4)
"""Image processing - draw rectangle"""
# مختصات: گوشه بالا-چپ و پایین-راست
top_left = (100, 100) # (x1, y1)
bottom_right = (400, 300) # (x2, y2)
# رسم مستطیل
cv2.rectangle(image, top_left, bottom_right, (255, 0, 0), 3)
· خط: cv2.line(image, start, end, color, thickness)
· دایره: cv2.circle(image, center, radius, color, thickness)
· بیضی: cv2.ellipse(image, center, axes, angle, startAngle, endAngle, color, thickness)
· خط: cv2.line(image, start, end, color, thickness)
· دایره: cv2.circle(image, center, radius, color, thickness)
· بیضی: cv2.ellipse(image, center, axes, angle, startAngle, endAngle, color, thickness)
راهنمای کامل دستورات رسم اشکال در OpenCV:
---
۱. خط - cv2.line()
```python
cv2.line(image, start_point, end_point, color, thickness)
```
پارامترها:
· start_point : نقطه شروع (x1, y1)
· end_point : نقطه پایان (x2, y2)
· color : رنگ خط (B, G, R)
· thickness : ضخامت خط (پیکسل)
مثال:
```python
# خط مورب از گوشه بالا-چپ به پایین-راست
cv2.line(image, (0, 0), (640, 480), (0, 255, 0), 2)
```
---
۲. دایره - cv2.circle()
```python
cv2.circle(image, center, radius, color, thickness)
```
پارامترها:
· center : مرکز دایره (x, y)
· radius : شعاع دایره (پیکسل)
· color : رنگ (B, G, R)
· thickness : ضخامت ( -1 = دایره توپر)
مثال:
```python
# دایره توپر قرمز در مرکز تصویر
cv2.circle(image, (320, 240), 50, (0, 0, 255), -1)
```
---
۳. بیضی - cv2.ellipse()
```python
cv2.ellipse(image, center, axes, angle, start_angle, end_angle, color, thickness)
```
پارامترها:
· center : مرکز بیضی (x, y)
· axes : نصف قطرها (طول_نصف_قطر_افقی, طول_نصف_قطر_عمودی)
· angle : زاویه چرخش بیضی (درجه)
· start_angle : زاویه شروع کمان (۰ تا ۳۶۰)
· end_angle : زاویه پایان کمان (۰ تا ۳۶۰)
· color : رنگ (B, G, R)
· thickness : ضخامت (-1 = توپر)
مثال:
```python
# بیضی آبی چرخش ۴۵ درجه - کامل
cv2.ellipse(image, (320, 240), (100, 50), 45, 0, 360, (255, 0, 0), 2)
# نیمدایره (کمان ۱۸۰ درجه)
cv2.ellipse(image, (200, 200), (80, 80), 0, 0, 180, (0, 255, 255), 3)
```
---
۴. مستطیل - cv2.rectangle()
```python
cv2.rectangle(image, top_left, bottom_right, color, thickness)
```
پارامترها:
· top_left : گوشه بالا-چپ (x1, y1)
· bottom_right : گوشه پایین-راست (x2, y2)
· color : رنگ (B, G, R)
· thickness : ضخامت (-1 = مستطیل توپر)
---
۵. چندضلعی - cv2.polylines()
```python
cv2.polylines(image, [points], is_closed, color, thickness)
```
پارامترها:
· points : آرایه نقاط [[x1,y1], [x2,y2], ...]
· is_closed : True = شکل بسته، False = باز
مثال:
```python
# مثلث
points = np.array([[320, 100], [200, 300], [440, 300]])
cv2.polylines(image, [points], True, (255, 255, 0), 2)
```
---
نکته کلی:
· thickness = -1 شکل رو توپر میکنه
· رنگها به فرمت (B, G, R) هستن
· مختصات x از چپ به راست، y از بالا به پایین
:
---
۶. پیکان - cv2.arrowedLine()
```python
cv2.arrowedLine(image, start_point, end_point, color, thickness, tipLength=0.1)
```
· tipLength : اندازه نوک پیکان نسبت به طول خط (پیشفرض ۰.۱)
مثال:
```python
cv2.arrowedLine(image, (50, 50), (200, 200), (0, 255, 0), 2, tipLength=0.2)
```
---
۷. نوشتن متن - cv2.putText() (که یاد گرفتیم)
---
۸. پر کردن محدوده - cv2.fillPoly()
```python
cv2.fillPoly(image, [points], color)
```
مثال:
```python
# ستاره توپر
points = np.array([[320, 100], [350, 180], [440, 180], [370, 230], [390, 310],
[320, 260], [250, 310], [270, 230], [200, 180], [290, 180]])
cv2.fillPoly(image, [points], (0, 255, 255))
```
---
۹. کلیه اشکال با cv2.polylines() که گفتم (چندضلعی)
---
۱۰. نشانگر (مارکر) - cv2.drawMarker()
```python
cv2.drawMarker(image, position, color, markerType, markerSize, thickness)
```
انواع مارکر:
· cv2.MARKER_CROSS : علامت +
· cv2.MARKER_TILTED_CROSS : علامت ×
· cv2.MARKER_STAR : ستاره
· cv2.MARKER_DIAMOND : لوزی
· cv2.MARKER_SQUARE : مربع
· cv2.MARKER_TRIANGLE_UP/DOWN : مثلث
مثال:
```python
cv2.drawMarker(image, (320, 240), (0, 0, 255), cv2.MARKER_CROSS, 20, 2)
```
---










