Bu maqolada sizlar bilan opencv kutubxonasi va boshqa kutubxonalar orqali maʼlum bir rangning traektoriyasini ekranda aks ettirishni koʻrib chiqamiz.

Bizga kerakli kutubxonalarning roʻyxati:

  • collections
  • numpy
  • argparse
  • imutils
  • cv2
  • urllib
Ishlash jarayoni
Ishlash jarayoni

Biror bir .py turdagi fayl hosil qilib olamiz. Va code yozishni boshladik.

from collections import deque
import numpy as np
import argparse
import imutils
import cv2
import urllib  

tail = []

ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video",
   help="path to the (optional) video file")
ap.add_argument("-b", "--buffer", type=int, default=64,
   help="max buffer size")
args = vars(ap.parse_args())
 

#ranglar= {'red':(166, 84, 141), 'green':(66, 122, 129), 'blue':(97, 100, 117), 'yellow':(23, 59, 119), 'orange':(0, 50, 80)} #assign new item lower['blue'] = (93, 10, 0)
lower = {'yellow':(23, 59, 119),} #assign new item lower['blue'] = (93, 10, 0)
#ranglar = {'red':(186,255,255), 'green':(86,255,255), 'blue':(117,255,255), 'yellow':(54,255,255), 'orange':(20,255,255)}
upper = {'yellow':(54,255,255),}
o_color = (23, 59, 119)

#ranglar= {'red':(0,0,255), 'green':(0,255,0), 'blue':(255,0,0), 'yellow':(0, 255, 217), 'orange':(0,140,255)}
colors = {'yellow':(0, 255, 217),}
draw_l = 0

if not args.get("video", False):
   camera = cv2.VideoCapture(0)
   

else:
   camera = cv2.VideoCapture(args["video"])

while True:  
   (grabbed, frame) = camera.read()  
   if args.get("video") and not grabbed:
       break

   frame = imutils.resize(frame, width=600)

   blurred = cv2.GaussianBlur(frame, (11, 11), 0)
   hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)  
   for key, value in upper.items():  
       kernel = np.ones((9,9),np.uint8)
       mask = cv2.inRange(hsv, lower[key], upper[key])
       mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
       mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)  
       cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
           cv2.CHAIN_APPROX_SIMPLE)[-2]
       center = None  
       if len(cnts) > 0:

           c = max(cnts, key=cv2.contourArea)
           ((x, y), radius) = cv2.minEnclosingCircle(c)
           M = cv2.moments(c)
           center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))  
           if radius > 0.5:  
               cv2.circle(frame, (int(x), int(y)), int(radius), colors[key], 2)
               tail.append([int(x),int(y), o_color, draw_l])
               cv2.putText(frame," ", (int(x-radius),int(y-radius)), cv2.FONT_HERSHEY_SIMPLEX, 0.6,colors[key],2)
   for fadjskin in tail:
    alla = tail[0]

   for hjsg in tail:
    if hjsg[3]:
     cv2.circle(frame, (hjsg[0], hjsg[1]), 2, hjsg[2], 1)
     cv2.line(frame, (alla[0], alla[1]),(hjsg[0], hjsg[1]), hjsg[2], 5)
    alla = hjsg

   cv2.imshow("Frame", cv2.flip(frame, 1))
   
   key = cv2.waitKey(1) & 0xFF

   if key == ord("t"):
       tail = []
   if key == ord("q"):
    break
   if key == ord("r"):
    o_color = (0, 0, 255)
   if key == ord("y"):
    o_color = (0, 255, 217)
   if key == ord("a"):
    draw_l = 1
     
   if key == ord("s"):
    draw_l = 0  
camera.release()
cv2.destroyAllWindows()

Kodni tushuntirishni boshlayman:

  • tail = [] bu keyinchlik kerak boʻluvchi traektoriyasi qaysi kordinatadaligini oʻzida saqlovchi list
  • Lower va upper esa qaysi rangdan boshlab qaysi rangngacha aniqlashini belgilaydi
  • colors ekranda qanday rangda yozilishini belgilaydi
  • Soʻngra cv2.VideoCapture(0) orqali camerani ulaymiz
  • Cameradagi tasvir toʻxtovsiz chiqib turishi uchun while True qilamiz
  • for key, value in upper.items():  bu joyda ranglarni nomi va darajasini oʻzgaruvchilarga beryapti
  • cv2.circle(frame, (int(x), int(y)), int(radius), colors[key], 2) agar radiusi 0.5 dan katta boʻlsa rang aniqlangan joyda aylana hosil boʻladi
  • tail.append([int(x),int(y), o_color, draw_l]) tailga list qoʻshamiz birichi elementi rang aniqlangan joyning kortinata oʻqdagi va ikkinchi elementida ordinata oʻqidagi joylashgan oʻrni yuboriladi, o_color esa ekranga chiziladigan rang, draw_l esa traektoriyasi ekranda koʻrinish koʻrinmasligi
  • for fadjskin in tail: fadjskin oʻzgaruvchisiga taildagi elementlarni navbati bilan bermoqdamiz
  • for hjsg in tail: hjsg oʻzgaruvchisiga tailning elementlarini navbati bilan bermoqdamiz
    	if hjsg[3]:
    		cv2.circle(frame, (hjsg[0], hjsg[1]), 2, hjsg[2], 1)
    		cv2.line(frame, (alla[0], alla[1]),(hjsg[0], hjsg[1]), hjsg[2], 5)
  • Bu kodda agar draw_i oʻsha listimizga qoʻshilayotgan paytda True qiymat qabul qilgan boʻlsa, rang aniqlangan kordinataga nuqta qoʻyiladi va nuqtalar tutashtirilib qoʻyiladi
  • cv2.imshow("Frame", cv2.flip(frame, 1)) ekranga tasvirni oʻgirgan holda koʻrsatadi
    if key == ord("t"):
        tail = []
    if key == ord("q"):
    	break
    if key == ord("r"):
    	o_color = (0, 0, 255)
    if key == ord("y"):
    	o_color = (0, 255, 217)
    if key == ord("a"):
    	draw_l = 1
    	
    if key == ord("s"):
    	draw_l = 0
  • Agar t tugmasi bosilsa tail listimiz tozaladi va hechqayerda chizma hosil boʻlmaydi
  • Agar q tugmasi bosilsa sikl tugaydi va dasturimiz toʻxtaydi
  • Agar r tugmasi bosilsa ekranga qizil rangda chiziladi
  • Agar y tugmasi bosilsa ekranga sariq rangda chiziladi
  • Agar a tugmasi bosilsa ekranga chiziladi
  • Agar s tugmasi bosilsa ekranga chizilmaydi

Videoda qanday ishlaganini koʻrishingiz mumkin!!!

https://youtu.be/v47qMfRl8Qs

Xulosa: Qoʻlimdagi sariq oddiygina latta, men sariq rangni qildim ammo koʻk yoki yashil rangdan foydalanish kerak chunki koʻp foydalanadigan ranglarda birinchi oʻrinlarda sariq turadi, sariqdan foydalanayotgangizda atrofingizdagi sariq (devol, chiroq, yuzingiz, qoʻlingiz va hk) ni ham chizib yuboradi. Siz boshqa ranglardan foydalanishingiz uchun kodda yozib qoʻydim.