دیدن کاغذرنگی با opencv

saalek110

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


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

cap = cv2.VideoCapture(0)

plt.ion()  # حالت تعاملی matplotlib (interactive mode)
fig, ax = plt.subplots()

while True:
    ret, frame = cap.read()
    if not ret:
        print("دوربین باز نشد")
        break

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # محدوده صورتی/بنفش
    lower_pink = np.array([125, 50, 50])
    upper_pink = np.array([165, 255, 255])

    mask = cv2.inRange(hsv, lower_pink, upper_pink)
    mask = cv2.GaussianBlur(mask, (7,7), 0)

    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    detected = False

    if contours:
        c = max(contours, key=cv2.contourArea)
        if cv2.contourArea(c) > 800:
            cv2.drawContours(frame, [c], -1, (0,255,0), 3)
            x,y,w,h = cv2.boundingRect(c)
            cv2.rectangle(frame, (x,y), (x+w, y+h), (255,0,0), 2)
            cv2.putText(frame, "PINK/PURPLE", (x, y-10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2)
            detected = True

    # تبدیل BGR به RGB
    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    # نمایش یا بروزرسانی عکس
    ax.clear()
    ax.imshow(frame_rgb)
    ax.axis("off")
    ax.set_title("پیدا شد" if detected else "پیدا نشد")
    plt.pause(1)  # مکث ۱ ثانیه قبل از گرفتن عکس بعدی

cap.release()
plt.ioff()
plt.show()
 

saalek110

Well-Known Member
برنامه زیر برای شناسایی اجسام قرمز است..
لکه های قرمز را دورش خط می کشد و درونش می نویسد قرمز.

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

min_area_px = 30  # حذف مناطق کوچک
# مقدار آستانه قرمز کم شده تا مناطق کم‌رنگ هم شناسایی شوند
red_threshold_low = 80 

cap = cv2.VideoCapture(0)
plt.ion()
fig, ax = plt.subplots()

while True:
    ret, frame = cap.read()
    if not ret:
        print("دوربین باز نشد")
        break

    frame_small = cv2.resize(frame, (320, 240))
    output = frame_small.copy()

    # تبدیل به HSV برای شناسایی بهتر رنگ قرمز
    hsv = cv2.cvtColor(frame_small, cv2.COLOR_BGR2HSV)

    # ماسک قرمز با محدوده گسترده‌تر
    lower_red1 = np.array([0, 30, 30])
    upper_red1 = np.array([15, 255, 255])
    lower_red2 = np.array([160, 30, 30])
    upper_red2 = np.array([180, 255, 255])

    mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
    mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
    red_mask = cv2.bitwise_or(mask1, mask2)

    # پیدا کردن مناطق قرمز
    num_labels, labels_im = cv2.connectedComponents(red_mask)

    for label in range(1, num_labels):
        ys, xs = np.where(labels_im == label)
        if len(xs) == 0:
            continue
        area = len(xs)
        if area < min_area_px:
            continue

        x_center = int(xs.mean())
        y_center = int(ys.mean())

        # نوشتن متن Red
        text = "Red"
        cv2.putText(output, text, (x_center-10, y_center),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 1)

        # خط باریک سبز دور منطقه
        region_mask = np.zeros(frame_small.shape[:2], np.uint8)
        region_mask[ys, xs] = 255
        contours, _ = cv2.findContours(region_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        cv2.drawContours(output, contours, -1, (0,255,0), 1)

    # مناطق غیر قرمز → No
    no_mask = cv2.bitwise_not(red_mask)
    num_labels_no, labels_no = cv2.connectedComponents(no_mask)

    for label in range(1, num_labels_no):
        ys, xs = np.where(labels_no == label)
        if len(xs) == 0:
            continue
        area = len(xs)
        if area < min_area_px:
            continue

        x_center = int(xs.mean())
        y_center = int(ys.mean())
        text = "No"
        cv2.putText(output, text, (x_center-10, y_center),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 1)

        # خط باریک آبی دور منطقه
        region_mask = np.zeros(frame_small.shape[:2], np.uint8)
        region_mask[ys, xs] = 255
        contours, _ = cv2.findContours(region_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        cv2.drawContours(output, contours, -1, (255,0,0), 1)

    ax.clear()
    ax.imshow(cv2.cvtColor(output, cv2.COLOR_BGR2RGB))
    ax.axis("off")
    plt.title("عالی اول - Red / No Detection")
    plt.pause(1)

cap.release()
plt.ioff()
plt.show()
 

saalek110

Well-Known Member
شرح برنامه قرمز یاب:


شرح برنامه:
این برنامه برای شناسایی سریع و ساده اجسام قرمز طراحی شده است. تصویر دوربین به صورت زنده دریافت می‌شود و هر منطقه بزرگ تصویر بررسی می‌شود:
اگر منطقه مقداری قرمز داشته باشد، روی آن متن “Red” نوشته می‌شود و دور آن خط سبز باریک کشیده می‌شود.
اگر منطقه قرمز نداشته باشد، روی آن متن “No” نوشته شده و دور آن خط آبی باریک کشیده می‌شود.
مناطق کوچک حذف می‌شوند تا نویز و لکه‌های جزئی دیده نشوند.
محدوده قرمز گسترده تعریف شده است تا حتی اجسام کم‌رنگ قرمز نیز شناسایی شوند.
تصویر هر ۱ ثانیه ثابت می‌ماند تا بتوان مناطق و برچسب‌ها را مشاهده کرد.
این برنامه برای تشخیص ساده و سریع رنگ قرمز در صحنه‌های واقعی بسیار کارآمد است و می‌تواند پایه‌ای برای پروژه‌های ردیابی رنگ یا رباتیک رنگی باشد.
 

saalek110

Well-Known Member
شرح کدهای برنامه قرمز یاب:

حتماً ، برای اینکه زیر برنامه منتشرشده، هم شرح عملکرد کلی باشد و هم کمی درباره کد توضیح داده شود، می‌توانی چیزی شبیه این بنویسی:
شرح برنامه و کدها
این برنامه برای تشخیص اجسام قرمز در تصویر زنده طراحی شده است. عملکرد برنامه به صورت مرحله‌ای در کد انجام می‌شود:
خواندن تصویر از دوربین و کاهش اندازه

frame_small = cv2.resize(frame, (320, 240))
تصویر از دوربین گرفته می‌شود و برای پردازش سریع‌تر به اندازه کوچک کاهش می‌یابد.
تبدیل تصویر به HSV و تعریف ماسک قرمز

hsv = cv2.cvtColor(frame_small, cv2.COLOR_BGR2HSV)
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
red_mask = cv2.bitwise_or(mask1, mask2)
برای شناسایی بهتر رنگ، تصویر به فضای رنگ HSV تبدیل می‌شود.
دو محدوده برای قرمز تعریف شده تا قرمز روشن و تیره شناسایی شود.
red_mask فقط پیکسل‌های قرمز را نشان می‌دهد.
شناسایی مناطق متصل (Connected Components)

num_labels, labels_im = cv2.connectedComponents(red_mask)
مناطق بزرگ قرمز به صورت جداگانه تشخیص داده می‌شوند.
مناطق کوچک‌تر از حد مشخص (min_area_px) حذف می‌شوند.
نوشتن متن روی مناطق و کشیدن خط دور آن‌ها

cv2.putText(output, text, (x_center-10, y_center), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 1)
cv2.drawContours(output, contours, -1, (0,255,0), 1)
روی مناطق بزرگ که قرمز هستند، متن “Red” نوشته می‌شود و دورشان خط سبز باریک کشیده می‌شود.
مناطق غیر قرمز مشابه با متن “No” و خط آبی مشخص می‌شوند.
نمایش تصویر با مکث یک ثانیه‌ای

plt.pause(1)
تصویر هر ۱ ثانیه ثابت می‌ماند تا بتوان مناطق و برچسب‌ها را مشاهده کرد و سپس عکس بعدی گرفته می‌شود.
نکات مهم برنامه:
محدوده قرمز گسترده تعریف شده است تا حتی رنگ کم‌رنگ قرمز نیز شناسایی شود.
مناطق کوچک حذف می‌شوند تا نویز و لکه‌های جزئی دیده نشوند.
برنامه سریع و ساده است و برای پروژه‌های ردیابی رنگ یا رباتیک رنگی کاربرد دارد.
 

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

بالا