نصب opencv بر گوشی

saalek110

Well-Known Member
نصب opencv بر گوشی


جامپ کنید به پست شماره ۶ ، که برای ۲۰۲۶ است...
پستهای قبل پست ۶ را می توانید ندیده بگیرید.
 
آخرین ویرایش:

saalek110

Well-Known Member

Opencv image process
دقیقا نمی دونم نرم افزار فوق چیه....فیلم می گیره و در پایین دستگیره هایی داره که میشه پارامترهایی را تغییر داد و نمای دوربین تغییر می کند.
 
آخرین ویرایش:

saalek110

Well-Known Member
سالک: مقاله زیر که از یک سایت فارسی کپی شده ۳ لینک داشت که دو تا را من منتقل کردم ولی سومی لینک به یک نرم افزار در گوگل استور است که موجود نیست.



شروع OpenCv اندروید
در ادامه سری آموزش های برنامه نویسی اندروید, به مبحث OpenCv می‌پردازیم. در این سری آموزش ها قصد داریم تا با استفاده از openCv در اندروید پردازش تصویر انجام دهیم. در این مقاله به مقدمات و مفاهیم مورد نیاز می‌پردازیم.

در ابتدا نیاز است تا از NDK استفاده شود. وقتی از کد های ++C در اندروید استفاده می کنیم, به NDK نیاز داریم. علت استفاده از NDK در پردازش تصویر نیز به این دلیل است که توابع و library های openCv به زبان ++C نوشته شده اند. برای دانلود NDK به اینجا مراجعه کنید.
اینجا:


نیاز است تا یک توضیح اجمالی پیرامون NDK ارائه دهیم. اگر بخواهید بخش های native در کد خود را Compile کنید, نیاز است تا از ndk-build tool استفاده کنید. در واقع ndk-build tool یک script است که متناسب با شرایط ذیل script ها دیگری را اجرا می‌کند :

  • به صورت خودکار پروژه را جستجو می‌کند تا مشخص کند کدام قسمت ها را باید build کند
  • بعد از اتمام جستجو به پردازش و مدیریت dependency ها می‌پردازد
  • library های ایجاد شده را به پروژه اضافه می‌کند
علاوه بر ndk-build tool نیاز است تا با یکسری component های دیگر آشنا شوید :

  • Java and Native Calls : برنامه های اندروید به زبان جاوا نوشته می‌شوند و کد ها بعد از compile به byteCode ها تبدیل می شود. این کد های تبدیل شده در سیستم عامل اندروید با استفاده از Dalvik یا Android Runtime (ART) اجرا می‌شوند. برنامه های که با استفاده از کد های native نوشته می‌شوند, تنها بر روی Dalvik آزمایش می‌شوند. وقتی یک متد native می‌خواهید تعریف کنید نیاز است تا واژه کلیدی “native” را در تعریف آن ذکر کنید. مانند :
public native zeroToHero(String username)
  • Native Shared Libraries : این فایل ها با استفاده از NDK و با فرمت so. ایجاد می‌شوند. این library ها در زمان اجرا به اشتراک گذاشته می‌شوند و به برنامه متصل می‌شوند
  • Native Static Libraries : این فایل ها با استفاده از NDK و با فرمت a. ایجاد می‌شوند. این library ها در زمان compile به برنامه اضافه می‌شوند
  • Java Native Interface : وقتی برنامه ها را در زبان جاوا می‌نویسیم و نیاز داریم تا از طریق یک کانال ارتباطی library های نوشته شده به زبان ++C را فراخوانی کنیم, از Java Native Interface و یا به اختصار JNI استفاده می‌شود
  • Application Binary Interface : با استفاده از این interface مشخص می‌شود که کد ها باید به چه صورتی باشند تا در معماری های مختلف اجرا شوند. به صورت پیش فرض NDK کد ها را برای معماری ARM EABI ایجاد می‌کند. اما می‌توان طوری تعیین کرد تا برای معماری هایی مانند MIPS و یا X86 نیز ایجاد شود
  • Android.mk : کارکرد آن را می‌توان مشابه Maven دانست. در حقیقت یک make file است که module ها و نام آنها, source file های مورد نیاز برای compile و library هایی که نیاز است تا به پروژه متصل شوند را برای ndk-build tools script تعیین می‌کند. شیوه استفاده از این فایل بسیار حائز اهمیت است و در راستای این مقالات با نحوه استفاده از آن اشنا می‌شوید
  • Application.mk : استفاده از این فایل اختیاری است. در این فایل module های مورد نیاز برنامه لیست می‌شوند. این اطلاعات می‌تواند شامل Application Binary Interface ها که به machine code تبدیل می‌شوند, toolchain ها و library های استاندارد باشد
با استفاده از این component ها می‌توان خلاصه توسعه یک برنامه native در اندروید را به این صورت بیان کرد :

  • مشخص می‌شود که کدام قسمت به زبان جاوا نوشته شود و کدام قسمت به زبان ++C
  • یک برنامه در android studio ایجاد می‌شود
  • با استفاده از Android.mk لیست native code هایی که باید compile شوند, module ها و library هایی که باید به پروژه متصل شوند مشخص می‌شود
  • فایل Android.mk در پوشه jni قرار می‌گیرد.
  • NDK با استفاده از ndk-build tool فایل ها با فرمت so. , کد های جاوا و a. فایل ها را به فایل dex تبدیل می‌کند و تمام فایل ها در کنار هم تشکیل یک فایل APK را می‌دهند.
برای استفاده از توابع و library ها نیاز داریم تا OpenCvSDK را نیز دریافت کرده و به پروژه اضافه کنیم. برای دانلود OpenCvSDK به اینجا مراجعه کنید.




سپس باید از قسمت sdk موجود در OpenCvSDK, پوشه java را به عنوان یک module به پروژه اضافه کنید. بعد از افزودن module یک import-summary.txt برای شما نمایش داده می‌شود که فایل هایی افزوده شده را لیست می‌کند. سپس نیاز است تا نام module را که در موقع اضافه کردن به پروژه مشخص کرده اید (ما در اینجا ZeroToHeroOpenCV انتخاب کرده ایم ), را به buid.gradle اضافه کنید :

compile project(':ZeroToHeroOpenCV')

در مسیر مشخص شده در تصویر پوشه jniLibs را ایجاد کنید و محتویات پوشه libs در پوشه native در مسیر sdk موجود در OpenCvSDK را در آن قرار دهید.

jnilibs.png

سپس پوشه افزوده شده را به build.gradle اضافه می‌کنیم :

android {
....
sourceSets { main { jni.srcDirs = [] } }
}
بر روی دستگاه اندرویدی شما حتما باید openCV Manager نصب باشد. برای نصب می‌توانید به اینجا مراجعه کنید.

سالک: در گوگل استور خطا می دهد ، گویا چنین نرم افزاری در گوگل استور وجود ندارد.

سپس با استفاده از کد زیر صحت افزوده شدن openCv را بررسی می‌کنیم :

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (OpenCVLoader.initDebug()) {
Log.d("Zero to hero", "OpenCV Lib Founded");
} else {
Log.d("Zero to hero", "Not found");

}
}
@Override
public void onCameraViewStarted(int width, int height) {

}

@Override
public void onCameraViewStopped() {

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
return null;
}
}
اگر تمام مراحل فوق را درست انجام داده باشید در Android Monitor این خروجی نمایش داده می‌شود :

vhdrjb.zerotohero.simpleopencv D/Zero to hero: OpenCV Lib Founded
در این مقاله سعی بر این شد تا مفاهیم اولیه و نصب openCv را بررسی کنیم.


کپی از :
 
آخرین ویرایش:

saalek110

Well-Known Member
پستهای قبلی را فراموش کنید، بروید اینجا


نسخه مناسب دستگاه خودتون را و اون بسته پایینی را دانلود کنید.

بعدش سه تا چیز دارید که باید نصب کنید
اولی pydroid 3 است
و دومی pydroid repository plugin
سومی هم یک اسم پرمیشن داخل اسمش است.


برای نصب opencv ، از منوی برنانه pydroid 3 ، اول بروید به pip
بعد در قسمت اینستال بنویسید opencv-python و تیک زیرش را هم بزارید باشه ، یعنی تیک prebuild ....را.

بعد دکمه نصب را بزنید تا نصب بشه.


هوش مصنوعی deepseek میگه این را هم می تونی بزنی. خط زیری را ببینید.

opencv-contrib-python

· محتوا: ماژول‌های اصلی به‌علاوه ماژول‌های اضافی (contrib).

سالک: ولی من opencv-python را زدم ولی contrib هم در بعضی برنامه ها استفاده شده. شاید بهتر باشه دومی را بزنید.
 
آخرین ویرایش:

saalek110

Well-Known Member
مثل نصب قبلی یعنی نصب opencv
باز بروید منو و pip را بزنید و بروید صفحه اینستال و Matplotlib را نصب کنید. تیک prebuild بازم باقی بماند.
 

saalek110

Well-Known Member
برنامه زیر را بیاندازید در ادیتور و دکمه زرد پایین و راست را بزنید تا play شود.


Python:
import cv2
import numpy as np
import matplotlib.pyplot as plt

print("️ برنامه ساخت و نمایش تصویر - ویژه Pydroid 3")
print("=" * 50)

# 1. ساخت یک تصویر جذاب‌تر
height, width = 400, 600
img = np.zeros((height, width, 3), dtype=np.uint8)

# پس‌زمینه گرادیان آبی
for x in range(width):
    intensity = int((x / width) * 200)
    img[:, x] = [200 - intensity, 100 + intensity, 50 + intensity]

# 2. اضافه کردن شکل‌های هندسی
# ستاره زرد
star_points = np.array([
    [300, 100], [320, 160], [380, 160],  # نقاط ستاره
    [330, 200], [350, 260], [300, 225],
    [250, 260], [270, 200], [220, 160],
    [280, 160]
])
cv2.fillPoly(img, [star_points], (0, 255, 255))  # زرد

# الگوی دایره‌های توخالی
for i in range(5):
    radius = 30 + i * 15
    cv2.circle(img, (150, 300), radius, (255, 255, 255), 2)

# 3. اضافه کردن متن
texts = [
    ("OpenCV + Pydroid 3", (180, 50)),
    ("اندروید", (280, 350)),
    ("Matplotlib Display", (200, 380))
]

for text, position in texts:
    cv2.putText(img, text, position, cv2.FONT_HERSHEY_SIMPLEX,
                0.7, (255, 255, 255), 2)

# 4. ذخیره تصویر
filename = 'my_design.png'
cv2.imwrite(filename, img)
print(f"✅ تصویر ساخته شد: {filename}")
print(f" ابعاد: {width}x{height} پیکسل")
print(f" عمق رنگ: {img.dtype}")
print("-" * 50)

# 5. نمایش با matplotlib - راه‌حل اصلی برای اندروید
# تبدیل BGR به RGB برای نمایش صحیح
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(10, 7))
plt.imshow(img_rgb)
plt.title('نمایش تصویر در Pydroid 3\n(با Matplotlib)',
          fontsize=16, fontweight='bold', pad=20)
plt.axis('off')

# اضافه کردن توضیحات پایین تصویر
plt.figtext(0.5, 0.01,
           f'فایل ذخیره شده: {filename} | ابعاد: {width}×{height}',
           ha='center', fontsize=10, style='italic')

plt.tight_layout()
plt.show()

print(" تصویر با موفقیت نمایش داده شد!")
print("\n برای مشاهده فایل ذخیره شده:")
print("1. به منوی 'File' در Pydroid بروید")
print("2. فایل 'my_design.png' را پیدا کنید")
print("3. روی آن کلیک کنید تا باز شود")

برنامه را من اجرا کردم. اجرا شد. اون Matplotlib گویا برای نمایش است. برای همین در پست قبل نصبش کردیم. در pydroid ۳ یک محدودیتی در نمایش داشت که با Matplotlib برطرف کردیم.
 

saalek110

Well-Known Member
برنامه رسم دایره و نوشتن یک متن:


کد:
import cv2
import numpy as np
import matplotlib.pyplot as plt

# ساخت تصویر
img = np.ones((300, 500, 3), dtype=np.uint8) * 255

# دایره
cv2.circle(img, (250, 150), 80, (0, 0, 255), 3) # قرمز

# متن
cv2.putText(img, "Circle + Text", (150, 280),
            cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 0), 2)

# نمایش با matplotlib (برای Pydroid)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.axis('off')
plt.show()

cv2.imwrite('output.png', img)
print("✅ Image saved as 'output.png'")
 

saalek110

Well-Known Member
Deepseek در مورد pydroid 3 :

برای تجربه‌ای روان‌تر و دسترسی کامل به فایل‌های دستگاه توصیه می‌شود دو پلاگین اصلی برنامه را نیز نصب کنید:

· Pydroid Repository: فرآیند نصب خودکار کتابخانه‌ها را ساده‌تر می‌کند.
· Pydroid Permissions Plugin: دسترسی برنامه به حافظه دستگاه برای ذخیره‌سازی پروژه‌ها را فراهم می‌آورد.
 

saalek110

Well-Known Member
سالک: این تاپیک برای opencv است ولی pydroid ۳ برای کدنویسی پایتون است و بازی هم میشه درش ساخت......
نظر هوش مصنوعی deepseek :

بله، در Pydroid 3 امکان ساخت بازی وجود دارد. این برنامه از کتابخانه‌های بازیسازی محبوبی مانند Pygame، Kivy و PyQt5 پشتیبانی می‌کند و می‌توانید با آنها بازی بنویسید. اما قبل از شروع، لازم است چند نکته مهم را بدانید.

برای اینکه اطلاعات کلیدی را راحت‌تر ببینید، خلاصه‌ای از وضعیت بازی‌سازی در Pydroid 3 و نکات مهم آن در ادامه آمده است.

✅ پشتیبانی از کتابخانه‌های بازیسازی

Pydroid 3 به‌طور مستقیم از Pygame 2 (برای بازی‌های دو بعدی)، Kivy (برای رابط کاربری چند پلتفرمی) و PySide6 (نسخه Qt برای پایتون) پشتیبانی می‌کند. این کتابخانه‌ها معمولاً از طریق مدیریت بسته درون برنامه (Pip) قابل نصب هستند.

⚠️ محدودیت‌ها و نکات مهم

· نمایش و تست فقط در خود برنامه: شما می‌توانید کد بازی را اجرا و نتیجه آن را در محیط خود Pydroid 3 مشاهده کنید. اما Pydroid 3 یک کامپایلر یا IDE است، نه یک سازنده پکیج اندرویدی. بنابراین امکان ساخت فایل نصبی مستقل (APK) برای نصب بازی روی گوشی دیگر در این برنامه وجود ندارد.
· نسخه رایگان در مقابل پولی: برخی از قابلیت‌های پیشرفته مانند پیش‌بینی کد (Code Prediction) که کدنویسی را سریع‌تر می‌کند، فقط در نسخه پولی (Premium) برنامه در دسترس هستند.
· محدودیت سخت‌افزاری گوشی: ساخت بازی‌های سه‌بعدی پیچیده یا با گرافیک سنگین ممکن است به دلیل محدودیت‌های قدرت پردازش و حافظه گوشی‌های موبایل، تجربه روانی نداشته باشد. بهتر است بر روی بازی‌های دوبعدی ساده یا متوسط تمرکز کنید.

برای نوشتن اولین بازی خود با Pygame، یک کد بسیار ساده وجود دارد که شما را با پایه‌ها آشنا می‌کند:

```python
import pygame
pygame.init()
# تنظیم صفحه نمایش و سایر کدهای اصلی بازی
```

اگر این کد ساده را در Pydroid 3 اجرا کنید، یک پنجره گرافیکی باز می‌شود و می‌توانید منطق بازی را توسعه دهید. برای شروع، تمرکز روی بازی‌های کلاسیک دوبعدی مانند Snake یا Flappy Bird انتخاب خوبی است که منابع آموزشی زیادی دارند.

گزینه‌های جایگزین برای ساخت مستقل APK

اگر هدف اصلی شما ساخت یک فایل APK برای انتشار یا نصب بازی روی دستگاه‌های مختلف است، باید ابزارهای دیگری را به‌کار گیرید. دو گزینه متداول برای انجام این کار روی رایانه (و نه در محیط موبایل) عبارتند از:

· Buildozer: یک ابزار رایگان است که پروژه‌های پایتون (مخصوصاً مبتنی بر Kivy) را به APK اندرویدی تبدیل می‌کند.
· Google Colab: می‌توانید از فضای ابری رایگان گوگل برای کامپایل کدهای پایتون و ساخت APK استفاده کنید.

اگر بخواهید تمام مراحل توسعه بازی را فقط روی گوشی موبایل انجام دهید و به APK برسید، چالش بسیار بزرگی در پیش دارید. برخی کاربران تجربه موفق‌آمیزی با ترکیب Pydroid 3 برای نوشتن کد و ترمینال ترمکس (Termux) برای اجرای دستورات پیشرفته گزارش کرده‌اند، اما این مسیر پیچیده است و برای مبتدیان توصیه نمی‌شود.

توصیه‌هایی برای شروع

1. با پروژه‌های کوچک شروع کنید: ابتدا یک بازی ساده (مثلاً حدس عدد) را فقط با رابط متنی (Console) پیاده‌سازی کنید تا با منطق پایه آشنا شوید.
2. گرافیک را اضافه کنید: در مرحله بعد، از کتابخانه Pygame برای افزودن گرافیک ساده به همان پروژه استفاده کنید.
3. منابع آموزشی را دنبال کنید: از آموزش‌های آنلاین یا کتاب‌های مخصوص بازیسازی با پایتون و Pygame کمک بگیرید.

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

اگر یک ایده مشخص برای بازی‌تان دارید (مثلاً نوع بازی یا کتابخانه مد نظر)، خوشحال می‌شوم راهنمایی دقیق‌تری کنم.
 

saalek110

Well-Known Member
یک نمونه بازی که یک مربع قرمز رسم می کند:

Python:
import pygame
import sys

# مقداردهی اولیه Pygame
pygame.init()

# تنظیمات پنجره بازی
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("بازی مربع متحرک - کنترل با کلیدهای جهت‌دار")

# رنگ‌ها
RED = (255, 0, 0)
BLUE = (0, 120, 255)
BACKGROUND = (20, 20, 30)

# مشخصات مربع بازیکن
square_size = 50
player_x = WIDTH // 2 - square_size // 2
player_y = HEIGHT // 2 - square_size // 2
speed = 7

# حلقه اصلی بازی
clock = pygame.time.Clock()
running = True

while running:
    # مدیریت رویدادها (مانند بستن پنجره)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
   
    # دریافت وضعیت کلیدهای فشرده شده
    keys = pygame.key.get_pressed()
    if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
        player_x += speed
    if keys[pygame.K_LEFT] or keys[pygame.K_a]:
        player_x -= speed
    if keys[pygame.K_DOWN] or keys[pygame.K_s]:
        player_y += speed
    if keys[pygame.K_UP] or keys[pygame.K_w]:
        player_y -= speed
   
    # جلوگیری از خروج مربع از مرزهای پنجره
    player_x = max(0, min(WIDTH - square_size, player_x))
    player_y = max(0, min(HEIGHT - square_size, player_y))
   
    # رسم گرافیک
    screen.fill(BACKGROUND)  # پس‌زمینه
    pygame.draw.rect(screen, RED, (player_x, player_y, square_size, square_size))  # مربع بازیکن
   
    # به‌روزرسانی نمایش
    pygame.display.flip()
    clock.tick(60)  # محدود کردن نرخ فریم به 60 فریم بر ثانیه

pygame.quit()
sys.exit()
 

saalek110

Well-Known Member
چگونه در Pydroid 3 اجرا کنیم؟

1. نصب Pygame: ابتدا مطمئن شوید کتابخانه Pygame نصب است. در Pydroid 3، به منوی نوار ابزار پایین بروید، روی آیکون Pip کلیک کنید و در کادر جستجو pygame را تایپ و آن را نصب کنید.
2. ایجاد فایل جدید: یک فایل جدید پایتون (مثلاً my_game.py) ایجاد کنید.
3. کپی و اجرا: کد بالا را در فایل کپی کرده و دکمه اجرا (Run) را بزنید.

کنترل بازی

· از کلیدهای جهت‌دار (↑, ↓, ←, →) روی صفحه‌کلید مجازی Pydroid استفاده کنید.
· یا از کلیدهای W, A, S, D (که در کد پشتیبانی شده‌اند) برای حرکت استفاده کنید.
· مربع قرمز نباید از مرزهای پنجره خارج شود.

برای توسعه و جذاب‌تر کردن بازی

می‌توانید این ایده‌ها را به کد اضافه کنید:

ایده توسعه چگونه پیاده‌سازی کنیم؟
اضافه کردن دشمن یک مربع آبی دیگر با موقعیت تصادفی ایجاد کنید که به سمت بازیکن حرکت کند.
جمع‌آوری امتیاز دایره‌های زرد (سکه) روی صفحه قرار دهید و با برخورد مربع به آن‌ها امتیاز جمع کنید.
شمارنده امتیاز با ماژول pygame.font امتیاز را روی صفحه نمایش دهید.
موانع ثابت چند مستطیل به عنوان دیوار رسم کنید و حرکت بازیکن را در برخورد با آن‌ها محدود کنید.
افزایش سرعت با جمع‌آوری هر ۵ سکه، سرعت حرکت بازیکن یا دشمن کمی افزایش یابد.

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

saalek110

Well-Known Member
مسیر پوشه فایلها


import os

# مسیر فولدری که این فایل پایتون در آن قرار دارد
print("مکان فعلی فایل کد:", os.getcwd())

# (اختیاری) لیست همه فایل‌های این پوشه
print("\nفایل‌های موجود در این پوشه:")
for file in os.listdir("."):
print(file)
 

saalek110

Well-Known Member
برنامه آسمان شب ، ماه دایره ای و ستاره ها را رسم می کند.

Python:
# یک سورپرایز ساده

import cv2

import numpy as np

# یک آسمان شب زیبا می‌سازیم

sky = np.zeros((300, 500, 3), dtype=np.uint8)

sky[:,:] = [10, 20, 40] # آبی تیره

# ستاره‌های تصادفی

for _ in range(50):

    x = np.random.randint(0, 500)

    y = np.random.randint(0, 300)

    cv2.circle(sky, (x, y), 2, (255, 255, 200), -1)

# ماه

cv2.circle(sky, (400, 80), 30, (240, 240, 200), -1)

# متن

cv2.putText(sky, "Good Night!", (150, 150),

            cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)


cv2.imwrite("night_sky.png", sky)

print("✅ آسمان شب ساخته شد: night_sky.png")

print(" فردا بیشتر کدهای باحال یاد می‌گیریم!")
 

saalek110

Well-Known Member
برنامه ای که یک فایل عکس می سازد ، اشکالی درش هست. فایل را ذخیره می کند

و بعد مجدد فایل را می خواند و مربع قرمز را در عکس پیدا می کند:

Python:
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("برنامه با موفقیت به پایان رسید!")
 

saalek110

Well-Known Member
برنامه استفاده از دوربین گوشی:

Python:
import cv2
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# راه‌اندازی دوربین
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)

print(" دوربین فعال شد...")
print("برای خروج: برنامه رو ببندید")

# ایجاد figure برای matplotlib
fig, ax = plt.subplots()
img_display = ax.imshow(np.zeros((240, 320, 3), dtype=np.uint8))
ax.axis('off')
plt.tight_layout()

def update(frame):
    ret, frame = cap.read()
    if ret:
        # پردازش ساده (تبدیل به خاکستری)
        processed = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)  # تبدیل BGR به RGB
        img_display.set_data(processed)
    return [img_display]

# انیمیشن برای آپدیت مداوم
ani = FuncAnimation(fig, update, interval=50, blit=True)
plt.show()

# وقتی پنجره بسته شد
cap.release()
print("✅ دوربین آزاد شد")
 

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

بالا