Hur till spår din Robot med OpenCV (11 / 28 steg)

Steg 11: Se upp alla ni som går in här



Okej. Här är alla Python kod på en gång. Bli inte rädd om denna ser förvirrande. Jag känner på samma sätt. I själva verket en del av det jag fortfarande inte förstår. (Hej, ärlighet en är en sällsynt fel jag verkar ha.) Igen, oroa dig inte, vi kommer att gå igenom den ett avsnitt på en gång, du och mig, kompis. Fram till slutet.

På baksidan, om du är en Python guru, eller yanno, bara en sassy-byxor: Känn dig fri att lägga till korrigeringar och kommentarer på denna sida. Jag skulle älska att göra denna kod växa genom kritik. Vet, jag garanterar följande: stavfel, grammatik problem, ologiska kodning, artefakter från felsökning och liknande. Men oroa dig inte, jag är tjock flådda och brukar bära min stora pojke trosor.

Jag hävda, skrevs den grundläggande koden för färg spårning av Birgitta Rahman i ett svar på Stack Overflow.

Dessutom har jag inkluderat koden som en bifogad fil, det är längst. Videospel söder.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
10p
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355

#Written av patos fylld hacka: C. Thomas Brittainimportcv2importnumpyasnpimportserialfromtimeimport sömn
importthreadingimportmathfrommathimport ARCTAN2, grader, pi
importrandom #Open COM port Tether bot.
ser = följetong. Följetong ('COM34', 9600)

#For att få information från Arduino (tx togs av Target X: P) globala rx
RX = "" #For skickar information till Arduinoglobal tranx
tranx = 0 #för att konvertera rubriken kompass till ett integerglobal intRx
intRx = 0 #I har inte använt detta ännu, men jag planerar skalning motor varaktighet baserat #how långt bort från targetglobal motorDuration
motorDuration = 0 #A flagga variabel för gängning min motor timer.global motorBusy


motorBusy = "Nej" #Holds frame indexglobal iFrame
iFrame = 0defOpenCV():
#Create videoinspelning
Cap = cv2. VideoCapture(0)

#Globalizing variablesglobal cxAvg #<---jag minns inte varför... globala cxFound
globala iFrame
globala intRx
globala rx
globala tranx

#Flag för att få ett nytt mål.
newTarget = "Ja" #Dot counter. Han är en hungrig flodhäst...
prickar = 0 #This innehar bot centroiden X & Y genomsnittet
cxAvg = 0
cyAvg = 0 #Stores gamla position för rörelsen bedömning.
xOld = 0
yOld = 0 #Clearing följetongen skicka sträng.
printRx = "" while(1):

#"printRx" är separat om jag vill #parse ut andra sensordata från bot
printRx =str(intRx)
#Bot rubrik, oförändrad
headingDeg = printRx
#Making det ett nummer så vi kan spela med den.
intHeadingDeg =int(headingDeg)

headingDeg =str(intHeadingDeg)

#Strings att hålla "Target låsstatus".
stringXOk = ""
stringYOk = "" #Incrementing frame index
iFrame = iFrame + 1 #Read ramar
_, ram = cap.read()

#Smooth det
ram = cv2.blur(frame,(3,3))

#Convert till hsv och hitta olika färger
HSV = cv2.cvtColor (ram, cv2. COLOR_BGR2HSV)
tröska = cv2.inRange (hsv,np.array ((0, 80, 80)),
/ np.array ((20, 255, 255)))
thresh2 = thresh.copy()

#Find konturer i tröskeln bilden
konturer, hierarki = cv2.findContours
(tröska, cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE)

#Finding kontur med maximal areal och lagrar det som best_cnt
max_area = 0for cnt i konturer:
Area = cv2.contourArea(cnt)
om området > max_area:
max_area = område
best_cnt = cnt

#Finding centroids best_cnt och rita en cirkel där
M = cv2.moments(best_cnt)
CX, cy = int(M['m10']/M['m00']), int(M['m01']/M['m00'])
CV2.Circle(Frame,(CX,CY),10,255,-1)

#After 150 ramar, jämför bot X och X genomsnitt, #if är de samma + eller - 5, det förutsätter bot är att tracked.if iFrame > = 150:
om cxAvg < (cx + 5) och cxAvg > (cx -5):
xOld == cxAvg
stringXOk = "X Lock" om cyAvg < (cy + 5) och cyAvg > (cy -5):
yOld == cyAvg
stringYOk = "Y Lock" #This är att hitta medelvärdet av X cordinate. Används för att fastställa #a visuell länk med robot. #X
cxAvg = cxAvg + cx
cxAvg = cxAvg /2 #Y
cyAvg = cyAvg + cy
cyAvg = cyAvg /2 #//Finding Target vinkel / / / #Target cordinates. #Randomizing target.if newTarget == "Ja":
tX = random.randrange (200, 400, 1)
tY = random.randrange (150, 350, 1)
newTarget = "Nej" om iFrame > = 170:
om tX > cxAvg-45and tX < cxAvg + 45:
Skriv ut "Gjort det genom X" om tY > cyAvg-45and tY < cyAvg + 45:
Print "Gjort det genom Y"
newTarget = "Ja"
prickar = prickar + 1 #Slope
DX = cxAvg - tX
dy = cyAvg - tY

#Quad jag--Goodif tX > = cxAvg och tY < = cyAvg:
rads = atan2(dy,dx)
degs = degrees(rads)
degs = degs -90 #Quad II--Goodelif tX > = cxAvg och tY > = cyAvg:
rads = atan2(dx,dy)
degs = degrees(rads)
degs = (degs * -1)
#Quad IIIelif tX < = cxAvg och tY > = cyAvg:
rads = atan2(dx,-dy)
degs = degrees(rads)
degs = degs +180 #degs = 3elif tX < = cxAvg och tY < = cyAvg:
rads = atan2(dx,-dy)
degs = degrees(rads) +180 #degs = 4 #Convert float till int
targetDegs =int(math.floor(degs))

#Variable att skriva ut grader offset från målet vinkel.
strTargetDegs = "" #Put målet vinkel till en sträng som skrivas ut.
strTargetDegs =str(math.floor(degs))

#///End att hitta målet vinkel / / / #/ / / flytta Bot ///#Don't börja flytta tills saker och ting ready.if iFrame > = 160:
#This jämför den bot rubrik med målet vinkel. Det måste #be +-30 för bot att gå framåt, annars kommer det turn.if intHeadingDeg < = (targetDegs + 30) och intHeadingDeg > + (targetDegs -30):
tranx = 3
motorDuration = 10 #I ska använda senare #Forwardelse:
om intHeadingDeg < targetDegs:
IF1 < (targetDegs - intHeadingDeg):
#abs (intHeadingDeg - targetDegs) > = 180:

tranx = 2
motorDuration = 10print (intHeadingDeg - targetDegs)
skriva ut "Rätt 1" elif1 > (targetDegs - intHeadingDeg):
#abs (intHeadingDeg - targetDegs) < 180:

tranx = 4
motorDuration = 10print (intHeadingDeg - targetDegs)
skriva ut "Vänster 1" elif intHeadingDeg > = targetDegs:
IF1 < (targetDegs - intHeadingDeg):
#abs (intHeadingDeg - targetDegs) < = 180:

tranx = 2
motorDuration = 10print (intHeadingDeg - targetDegs)
skriva ut "Rätt 2" elif1 > (targetDegs - intHeadingDeg):
#abs (intHeadingDeg - targetDegs) > 180:

tranx = 4
motorDuration = 10print (intHeadingDeg - targetDegs)
skriva ut "Vänster 2" #/ / / slutet flytta Bot ///#///CV Dawing / / / #Target cirkel
CV2.Circle (ram, (tX, tY), 10, (0, 0, 255), tjocklek =-1)

#ser.write (botXY) #Background för text.
CV2.Rectangle (ram, (18,2), (170,160), (255,255,255), -1)

#Target vinkel.
CV2.line (ram, (tX, tY), (cxAvg,cyAvg),(0,255,0), 1)

#Bot's X och Y är skriven till bild
CV2.putText(Frame,Str(CX) + "cx," + str(cy) + "cy", (20,20), cv2. FONT_HERSHEY_COMPLEX_SMALL,.7,(0,0,0))

#Bot's X- och Y medelvärden skrivs till bild
CV2.putText(Frame,Str(cxAvg) + "cxA," + str(cyAvg) + "cyA", (20,40), cv2. FONT_HERSHEY_COMPLEX_SMALL,.7,(0,0,0))

#"Ok" är skriven till skärmen om X & Y är nära till X & Y Avg för flera iterationer.
CV2.putText (ram, stringXOk, (20,60), cv2. FONT_HERSHEY_COMPLEX_SMALL,.7,(0,0,0))
CV2.putText (ram, stringYOk, (20,80), cv2. FONT_HERSHEY_COMPLEX_SMALL,.7,(0,0,0))

#Print kompassen på ramen.
CV2.putText (ram, "Bot:" + headingDeg + "Deg", (20,100), cv2. FONT_HERSHEY_COMPLEX_SMALL,.7,(0,0,0))
CV2.putText (ram, "mål:" + strTargetDegs + "Deg", (20,120), cv2. FONT_HERSHEY_COMPLEX_SMALL,.7,(0,0,0))

#Dots äts.
CV2.putText (ram, "prickar åt:" + str (prickar), (20,140), cv2. FONT_HERSHEY_COMPLEX_SMALL,.7,(0,0,0))

#After ram har ändrats för helvete, Visa den.
CV2.imshow('frame',Frame) #Color bilden
CV2.imshow('thresh',thresh2) #Black-n-vit tröskel bild #/ / / slutet CV Rita ///if cv2.waitKey (33) == 27:
# Städa upp allt innan avresa
CV2.destroyAllWindows()
Cap.release()
#Tell roboten att stoppa innan du avslutar.
ser.write("5")
ser.Close() # stänger den seriella connection.breakdefrxtx():

# Under 32 är allt i ASCII rotvälska
räknare = 32 #So data kan skickas till OpenCV thread.global rx
globala intRx
globala tranx
globala motorDuration
globala motorBusy

While(true):
räknaren + = 1# läsa nyaste utdata från Arduino
RX = ser.readline()

#This är för gängning ut motor timern. Vilket möjliggör kontroll #over motorn brast duration.if motorBusy == "Nej":
ser.write(tranx)
ser.flushOutput() #Clear bufferten?
motorBusy = "Ja" #Delay en tiondel av en sekund
Sleep(.1)

#This är tänkt för att ta bara de tre första siffrorna.
RX = rx [: 3]

#This tar bort eventuella EOL-tecken
RX = rx.strip()

#If numret är mindre än 3 siffror, då det kommer att ingå #we bli av med det så vi kan ha en ren str till int konvertering.
RX = rx.replace (".", "")

#We gillar inte 0. Så, detta tar bort den. försök:
intRx =int(rx)
exceptValueError:
intRx = 0 #Reset counter om över 255. om counter == 255:
räknare = 32defmotorTimer():
globala motorDuration
globala motorBusy

While(1):
om motorBusy == "Ja":
Sleep(.2) #Sets motorn brast längd.
ser.write("5")
Sleep(.3) #Sets tid emellan motor spricker.
motorBusy = "Nej" #Threads OpenCV grejer.
OpenCV = threading. Thread(Target=opencv)
OpenCV.start()

#Threads seriell funktioner.
rxtx = threading. Thread(Target=rxtx)
rxtx.start()

#Threads de motoriska funktionerna.
motorTimer = threading. Thread(Target=motorTimer)
motorTimer.start()

Se Steg
Relaterade Ämnen

Hur till underhålla din hund med en Laser medan du är borta

i detta instructable, du kommer att göra en spinning laser, liknar de dyra laser hund leksaker, genom att fästa en laser till en penna.Det är väldigt roligt för någon hund/sällskapsdjur!Steg 1: material Behöver du:-1 klass IIIA eller under Laser (du...

Hur till göra indiska Pizza med karamelliserad lök, potatis och pistaschmandlar

indiska pizza, i mitt sinne, övertrumfar nästan varje annan smak ute. Jag tror det är kombinationen av komplext kryddade kryddor och smaker i indisk mat, utan med bröd och ost combo som är perfekt på pizza.Denna vinnande kombination verkar tyvärr var...

Hur till fart upp din mac, start på Mac OSX 10.10 Yosemite

Hur till fart upp din mac, start på Mac OSX 10.10 Yosemite.Videon går över de enkla stegen om hur man gör datorn snabbare....

Hur till hålla din hund underhöll

hur till hålla din hund underhöll...

Hur till bära en penna med din MOLESKINE

det finns många bra instructables om hur man bygger en pennhållare för bärbara moleskine.Jag skulle vilja föreslå en annan enkel enkel enkel lösning, för att bära din penna med din moleskine utan bygga något.Denna lösning kräver inte dig att ändra di...

Styra din Robot med en Wii Nunchuck (och en Arduino)

efter bär själv spela Wii boxning jag måste tänka vore det inte bra om jag kunde använda detta för att styra min robot, (ser att min vänstra hand).Titta runt på internet hittade jag en uppsjö av människor som gör liknande saker, (länkar till alla bar...

Hur till stöveln Raspberry Pi med NOOBS

om du inte vet, raspberry Pi är en kreditkort storlek dator. Den ursprungligen skapades för att hjälpa ungdomar lära sig hur man programmerar. Eftersom projekten starta denna lilla styrelse har kommit långt. Det finns finns flera modeller av Pi. I de...

Hur till applicera och sälja med handgjorda på Amazon

Amazon nyligen öppnat upp en alla handgjorda marknadsplats på deras webbplats som kallas handgjorda på Amazon. Som någon som har försäljning av broderier och smycken i år via Etsy, var jag sugen på att testa en annan marknadsplats.Genom åren har jag...

Hur till göra din MacBook eller MacAir power kabel senast för evigt! Tja, inte riktigt...!

MagSafe tegel är ett fast arbete, en design som används för att driva upp iPads, iPhone och MacBook serie av bärbara datorer. MagSafe för PowerBook har dock ett allvarligt problem.Steg 1: Kärnan i problemet med MagSafe kopplingarna till bärbara Mac-d...

Hur till göra Hang Tags (med en laserskärare)

hur man gör Hang Tags (med en laserskärare)Jag började en sida varumärke i sommar, bara på kul. Jag brukade spela i en massa band tillbaka i dag och vi hade alla "sidan projekt" eller band som vi gjorde något annorlunda med förutom den spelade v...

Hur till karta över din Wi-Fi Signal

Stoppa guesstimating hur stark du tycker din WiFi täckningen är. Se exakt där du signal styrka är varmt, kallt, eller någonstans däremellan, och skapa en heatmap av din WiFi signal. Med detta, kommer du att kunna visualisera kvaliteten på WiFi täckni...

Hur till wood grain din surfbräda

Detta är en grundläggande metod för att få det trä titt kan det göras på alla målningsbara ytor.Steg 1: Hur man gör woodgrain på en surfbräda på lätt sätt :)Färgen jag använder är en mycket grundläggande svart akryl.I verkligheten kan det vara någon...

Hur till avsluta CAT 5 kabel med en RJ-45-kontakt

i detta Instructable, jag lär dig hur du avsluta CAT 5 kabel med en RJ-45 kontakt. Detta är lätt när du får kläm på det, och blir en andra natur efter ca 15-20 minuter. När du lär dig att avsluta CAT 5-kabel, kommer du vara väl på väg att avsluta 4 &...

ILamp: hur till vända din Smartphone till en lampa

det tar inte lång tid att märka smartphone vurm som tar över landet!När du går på gatan, det verkar som nästan alla trycka bort vid den glödande skärmen, ögon limmade till det mer än sin omgivning. Jag tänker inte ljuga, jag är också fäst vid min iPh...

Styra din Robot med hjälp av mobiltelefon

Denna hela handledning är också tillgänglig på min hemsidaHej kommer världen i detta inlägg jag att visa dig hur man styr roboten med hjälp av mobiltelefon. Styr en robot med hjälp av mobiltelefon är inte så komplicerat som ditt tänkande det är mycke...

Hur till omsorg For din sällskapsdjur trädgård sniglar! (endast trädgård sniglar)

Trött på din gamla sällskapsdjur? Vill du ha en ny? Varför blir du inte en snigel gård eller bara en snigel? De är så lätt och är mycket billiga nästan gratis att hålla! 3 av bilderna nedan är mina snailarium och sniglar!Steg 1: Att hitta rätta. Ok,...

Hur till: gör din egen senap!

Göra senap hemma är inte så svårt som du tror - i själva verket, med mindre än en halvtimme av verkligt arbete, kan du ha senap!Den värsta delen är väntan - du kan inte äta senap direkt, och det är bäst att vänta ett par dagar att verkligen gräva. :)...

Hur till utsträcka din Fönstren sammanhangen menyerna för att vara mer produktiva

Om du gör en aktivitet på datorn mer än en gång, hittade du några optimering potential. I mitt fall, jag var tvungen att lägga till året, månad och dag på jag fått den bestämd arkivera i filnamnet alldeles för ofta. Detta instructable kommer att lära...

Hur till tåg din hund ordentligt

Mest sällskapsdjur egendomsrätt kommer någon gång uppleva en sällskapsdjur med en okrossbar anda. Min första hund ville inget annat än att lyda och inlärda kommandon och tricks med lätthet. Min andra hund, dock skulle göra något sådant. I detta instr...