تغییر فاز رنگ و tracking

  • مدرس: علی بیگدلی
  • تاریخ انتشار: Sep 05, 2020

اهداف

  • در این آموزش ، شما می آموزید که چگونه با استفاده از فضا های رنگی که در قسمت فراخوانی عکس و ویرایش یاد گرفتید یک شئ را جدا سازی کنید.
  • علاوه بر این ، ما یک برنامه کاربردی برای استخراج یک شی رنگی در یک ویدیو ایجاد خواهیم کرد که به شما اجازه دنبال کردن آن را نیز خواهد داد.
  • و همچنین توابع  ذکر شده را فرا خواهید گرفت cv.cvtColor () ، cv.inRange () 

تغییر فضای رنگ

بیش از 150 روش تبدیل فضای رنگی در OpenCV وجود دارد. اما ما فقط دو مورد را بررسی خواهیم کرد که بیشترین مورد استفاده را دارند: BGR ↔ Grey و BGR HSV.

برای تبدیل رنگ ، ما از تابع cv.cvtColor (input_image، flag) استفاده می کنیم که در آن flag نوع تبدیل را تعیین می کند.

  • برای تبدیل BGR → grey ، ما از پرچم cv.COLOR_BGR2GRAY استفاده می کنیم.
  • به طور مشابه برای BGR HSV ، ما از پرچم cv.COLOR_BGR2HSV استفاده می کنیم.

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

import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print( flags )

توجه : برای HSV ، محدوده رنگ [0،179] ، محدوده اشباع [0،255] و محدوده مقدار [0،255] است. نرم افزارهای مختلف از مقیاس های مختلف استفاده می کنند. بنابراین اگر مقادیر OpenCV را با آنها مقایسه می کنید ، باید این دامنه ها را عادی کنید.

Object Tracking

اکنون که می دانیم چگونه یک تصویر BGR را به HSV تبدیل کنیم ، می توانیم از این روش برای استخراج یک جسم رنگی استفاده کنیم. در HSV ، نمایش رنگ آسان تر از فضای رنگی BGR است. در برنامه ما ، سعی خواهیم کرد یک شی colored رنگی آبی استخراج کنیم. بنابراین روش اینجاست:

  • هر فریم از فیلم را بگیرید
  • تبدیل از BGR به فضای رنگی HSV
  • ما تصویر HSV را برای محدوده ای از رنگ آبی آستانه می گیریم
  • اکنون شی blue آبی را به تنهایی استخراج کنید ، ما می توانیم هر کاری را که می خواهیم روی آن تصویر انجام دهیم.

در زیر کدی آورده شده است که با جزئیات توضیح داده شده است:

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
    # Take each frame
    _, frame = cap.read()
    # Convert BGR to HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    # Threshold the HSV image to get only blue colors
    mask = cv.inRange(hsv, lower_blue, upper_blue)
    # Bitwise-AND mask and original image
    res = cv.bitwise_and(frame,frame, mask= mask)
    cv.imshow('frame',frame)
    cv.imshow('mask',mask)
    cv.imshow('res',res)
    k = cv.waitKey(5) & 0xFF
    if k == 27:
        break
cv.destroyAllWindows()

در زیر تصویر ردیابی شی blue آبی نشان داده شده است:

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

 

چگونه مقادیر HSV را برای ردیابی پیدا کنیم؟

این یک سوال معمول است که در stackoverflow.com یافت می شود. این بسیار ساده است و می توانید از همان عملکرد cv.cvtColor () استفاده کنید. به جای عبور از یک تصویر ، شما فقط مقادیر BGR مورد نظر خود را منتقل می کنید. به عنوان مثال ، برای یافتن مقدار HSV گرین ، دستورات زیر را در ترمینال پایتون امتحان کنید:

>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]

اکنون [H-10 ، 100،100] و [H + 10 ، 255 ، 255] را به ترتیب مرز پایین و بالا قرار می دهید. جدا از این روش ، برای یافتن این مقادیر می توانید از ابزار ویرایش تصویر مانند GIMP یا مبدل های آنلاین استفاده کنید ، اما تنظیم دامنه های HSV را فراموش نکنید.

برنامه نمونه برای کنترل Low HSV و High HSV و آستانه سازی با trackbar:

import cv2
import numpy as np

def nothing(x):
    pass

cap = cv2.VideoCapture(0)
cv2.namedWindow("Trackbars")

cv2.createTrackbar("L – H", "Trackbars", 0, 179, nothing)
cv2.createTrackbar("L – S", "Trackbars", 0, 255, nothing)
cv2.createTrackbar("L – V", "Trackbars", 0, 255, nothing)
cv2.createTrackbar("U – H", "Trackbars", 179, 179, nothing)
cv2.createTrackbar("U – S", "Trackbars", 255, 255, nothing)
cv2.createTrackbar("U – V", "Trackbars", 255, 255, nothing)

while True:
    _, frame = cap.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    l_h = cv2.getTrackbarPos("L – H", "Trackbars")
    l_s = cv2.getTrackbarPos("L – S", "Trackbars")
    l_v = cv2.getTrackbarPos("L – V", "Trackbars")
    u_h = cv2.getTrackbarPos("U – H", "Trackbars")
    u_s = cv2.getTrackbarPos("U – S", "Trackbars")
    u_v = cv2.getTrackbarPos("U – V", "Trackbars")

    lower_blue = np.array([l_h, l_s, l_v])
    upper_blue = np.array([u_h, u_s, u_v])
    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    result = cv2.bitwise_and(frame, frame, mask=mask)

    cv2.imshow("frame", frame)
    cv2.imshow("mask", mask)
    cv2.imshow("result", result)

    key = cv2.waitKey(1)
    if key == 27:
        break

cap.release()
cv2.destroyAllWindows()

نمونه خروجی:

 

ثبت دیدگاه
نام *
ایمیل*
دیدگاه *
0دیدگاه