Բովանդակություն:

Opencv օբյեկտի հետևում. 3 քայլ
Opencv օբյեկտի հետևում. 3 քայլ

Video: Opencv օբյեկտի հետևում. 3 քայլ

Video: Opencv օբյեկտի հետևում. 3 քայլ
Video: Data Science with Python! Extracting Metadata from Images 2024, Նոյեմբեր
Anonim
Opencv օբյեկտի հետևում
Opencv օբյեկտի հետևում

Շարժվող օբյեկտի հայտնաբերումը տեխնիկա է, որն օգտագործվում է համակարգչային տեսողության և պատկերի մշակման մեջ: Տեսանյութից մի քանի հաջորդական կադրեր համեմատվում են տարբեր մեթոդների միջոցով `որոշելու, թե արդյոք հայտնաբերվում է շարժվող առարկա:

Շարժվող օբյեկտների հայտնաբերումը կիրառվել է այնպիսի ծրագրերի լայն շրջանակի համար, ինչպիսիք են տեսահսկումը, գործունեության ճանաչումը, ճանապարհների վիճակի մոնիտորինգը, օդանավակայանների անվտանգությունը, ծովային սահմանի պաշտպանության վերահսկողությունը և այլն:

Շարժվող օբյեկտի հայտնաբերումը նշանակում է ճանաչել օբյեկտի ֆիզիկական տեղաշարժը տվյալ վայրում կամ տարածաշրջանում [2]: Գործելով շարժվող օբյեկտների և ստացիոնար տարածքի կամ տարածաշրջանի միջև հատվածավորումը, շարժվող օբյեկտների շարժը կարող է հետևվել և դրանով իսկ հետագայում վերլուծվել: Դրան հասնելու համար դիտեք, որ տեսահոլովակը կառուցվածք է, որը կառուցված է մեկ շրջանակի վրա: Շարժվող օբյեկտի հայտնաբերումն առաջին պլանի շարժվող թիրախ (ների) հայտնաբերումն է `յուրաքանչյուր տեսաֆիլմում կամ միայն այն ժամանակ, երբ շարժվող թիրախը ցույց է տալիս տեսանյութի առաջին տեսքը:

Ես պատրաստվում եմ օգտագործել Opnecv և Python համադրությունը `գույնի հիման վրա օբյեկտները հայտնաբերելու և հետևելու համար

Քայլ 1. Reանաչված օբյեկտի վրա ուղղանկյուն նկարելը

եթե ձեր համակարգիչը չունի python կամ opencv, հետևեք ստորև բերված անուղղելի հրահանգներին

ահա պիթոնի ծածկագիրը.

ներմուծել cv2import numpy որպես np

cap = cv2. VideoCapture (0)

իսկական True:

_, շրջանակ = cap.read () hsv = cv2.cvtColor (շրջանակ, cv2. COLOR_BGR2HSV)

ստորին_դեղին = np. զանգված ([20, 110, 110])

վերին_դեղին = np. զանգված ([40, 255, 255])

դեղին_դիմակ = cv2.inRange (hsv, lower_yellow, above_yellow)

(_, ուրվագծեր, _) = cv2.findContours (դեղին_դիմակ, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

ուրվագծերի ուրվագծի համար.

տարածք = cv2.contourArea (ուրվագիծ)

եթե (տարածք> 800):

x, y, w, h = cv2.bounding

cv2.imshow («հետևում», շրջանակ)

k = cv2.waitKey (5) & 0XFF

եթե k == 27: ընդմիջում

cv2.destroyAllWindows ()

cap.release ()

Քայլ 2. Բացահայտեք այն ճանապարհը, որով շարժվել է առարկան

ուղին հետագծելու համար.

i- ի համար միջակայքում (1, լեն (կենտրոնական_նիշեր)). b = պատահական. նշանագիր (230, 255) գ = պատահական: նշանագիր (100, 255) r = պատահական: նշան (100, 255), եթե math.sqrt ((((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (շրջանակ, կենտրոնի_կետեր [i - 1], կենտրոնի_նիշեր , (b, g, r), 4)

Քայլ 3: Երկու կոդերի ինտեգրում

Ես մտադիր եմ միացնել երկուսն էլ կոդը

ներմուծել cv2import numpy որպես np ներմուծել պատահական հավաքածուներից ներմուծման դեկեկ

cap = cv2. VideoCapture (1)

# Հետևելու բոլոր այն կետերին, որտեղ օբյեկտն այցելել է կենտրոն

իսկական True:

# Կարդալ և շրջել շրջանակ _, շրջանակ = cap.read () շրջանակ = cv2.flip (շրջանակ, 1)

# Մի փոքր պղտորեք շրջանակը

blur_frame = cv2. GaussianBlur (շրջանակ, (7, 7), 0)

# Փոխարկեք BGR- ից HSV գունային ձևաչափի

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

# Սահմանեք հայտնաբերելու համար hsv գույնի ստորին և վերին տիրույթը: Կապույտ այստեղ

lower_blue = np.array ([100, 50, 50]) above_blue = np.array ([140, 255, 255]) դիմակ = cv2.inRange (hsv, lower_bleue, above_blue)

# Պատրաստեք էլիպսաձև միջուկ

միջուկ = cv2.getStructuringElement (cv2. MORPH_ELLIPSE, (15, 15))

# Բացման մորֆ (էրոզիա, որին հաջորդում է ընդլայնում)

դիմակ = cv2.morphologyEx (դիմակ, cv2. MORPH_OPEN, միջուկ)

# Գտեք բոլոր ուրվագծերը

ուրվագծեր, հիերարխիա = cv2.findContours (mask.copy (), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE) [-2:]

եթե len (ուրվագծեր)> 0:

# Գտեք ամենամեծ ուրվագիծը ամենամեծ_կոնտուրը = առավելագույնը (ուրվագծեր, բանալին = cv2.contourArea)

# Գտեք եզրագծի կենտրոնը և նկարեք լցված շրջան

պահեր = cv2.moments (ամենամեծ_կոնտուր) centre_of_contour = (int (պահեր ['m10'] / պահեր ['m00']), int (պահեր ['m01'] / պահեր ['m00'])) cv2. շրջանակ (շրջանակ, կենտրոնի_կոնտուր, 5, (0, 0, 255), -1)

# Եզրագծը կապեք շրջանով

էլիպս = cv2.fitEllipse (ամենամեծ_կոնտուր) cv2.ellipse (շրջանակ, էլիպս, (0, 255, 255), 2)

# Պահեք եզրագծի կենտրոնը, որպեսզի գծենք այն հետևող գիծ

center_points.appendleft (centre_of_courour)

# Գծեք գծեր եզրագծի կենտրոնական կետերից

i- ի համար միջակայքում (1, լեն (կենտրոնական_նիշեր)). b = պատահական. նշանագիր (230, 255) գ = պատահական: նշանագիր (100, 255) r = պատահական: նշան (100, 255), եթե math.sqrt ((((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (շրջանակ, կենտրոնի_կետեր [i - 1], կենտրոնի_նիշեր , (b, g, r), 4)

cv2.imshow («օրիգինալ», շրջանակ)

cv2.imshow («դիմակ», դիմակ)

k = cv2.waitKey (5) & 0xFF

եթե k == 27: ընդմիջում

cv2.destroyAllWindows ()

cap.release ()

Խորհուրդ ենք տալիս: