Navigation eines Autonomen-Roboters mittels Kamera

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das bedeutet ja erstmal, dass der Frame leer ist. Die Frage ist, ob alle leer sind. Was passiert, wenn du auf None prüfst?
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Ich hab es geschafft. Hab gestern durch Recherchen und auch bisschen Glück gefunden wie es funktioniert. Hab mal ein Video eingesetzt und mein Programm funktioniert bis jetzt perfekt. Nächster Schritt wäre das zusammenbauen, dann können die Tests durchgeführt werden.

Sollte ich Fragen haben, melde ich mich wieder.
Danke erstmals!
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Reicht es für die Data Collection einfach mit dem Roboter (händisch) die Strecke mehrmals durch zu fahren und so mithilfe der Kamera die Bilder in einem Ordner zu speichern?

Code für die Aufnahme wäre folgender:

Code: Alles auswählen

import cv2

cap = cv2.VideoCapture(0)

def getImg(display= False,size=[480,240]):
    _, img = cap.read()
    img = cv2.resize(img,(size[0],size[1]))
    if display:
        cv2.imshow('IMG',img)
    return img

if __name__ == '__main__':
    while True:
        img = getImg(True)
und folgender Code für das Speichern der Bilder:

Code: Alles auswählen

import pandas as pd
import os
import cv2
from datetime import datetime

global imgList, steeringList
countFolder = 0
count = 0
imgList = []
steeringList = []

myDirectory = os.path.join(os.getcwd(), 'DataCollected')
# print(myDirectory)

while os.path.exists(os.path.join(myDirectory,f'IMG{str(countFolder)}')):
        countFolder += 1
newPath = myDirectory +"/IMG"+str(countFolder)
os.makedirs(newPath)

def saveData(img,steering):
    global imgList, steeringList
    now = datetime.now()
    timestamp = str(datetime.timestamp(now)).replace('.', '')
    #print("timestamp =", timestamp)
    fileName = os.path.join(newPath,f'Image_{timestamp}.jpg')
    cv2.imwrite(fileName, img)
    imgList.append(fileName)
    steeringList.append(steering)

def saveLog():
    global imgList, steeringList
    rawData = {'Image': imgList,
                'Steering': steeringList}
    df = pd.DataFrame(rawData)
    df.to_csv(os.path.join(myDirectory,f'log_{str(countFolder)}.csv'), index=False, header=False)
    print('Log Saved')
    print('Total Images: ',len(imgList))

if __name__ == '__main__':
    cap = cv2.VideoCapture(1)
    for x in range(10):
        _, img = cap.read()
        saveData(img, 0.5)
        cv2.waitKey(1)
        cv2.imshow("Image", img)
    saveLog()
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Grundsaetztlich reicht das, ja. Allerdings wuerde ich doch den Einsatz eines VideoWriters empfehlen, womit du dann Platz sparst. https://learnopencv.com/read-write-and- ... pp-python/

Und ich wuerde darueber nachdenken, ob du die Bilder wirklich resizen willst. Es ist normalerweise immer besser, Daten in der besten Qualitaet zu haben, weil man dann immer noch spaeter entscheiden kann, die zu reduzieren. Das mag im vorliegenden Fall aufgrund einer simplen Aufgabenstellung nicht soooo wichtig sein, aber vielleicht ein Tipp fuer die Zukunft.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Danke für deinen Tipp __deets__. Ich habe mir die Seite angeschaut.

Mir ist aufgefallen das in meinem Code sozusagen ein Start- und Stoppbefehl fehlt. Ich würde ja in diesem Fall ein unendlich langes Video aufnehmen oder?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Naja, bis man es abbricht eben. Warum willst du da extra starten und stoppen? Du kannst das Material ja nachträglich noch zurecht schneiden.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Ich habe ein kleines Problem beim verstehen der Funktionsweise. Um nochmal alles klarzustellen: Ich hab ein Programm für die Lienen Verfolgung was auch funktioniert. Meine Frage wäre ob ich mit diesem Programm das Fahrzeug direkt fahren lassen kann im Sinne von (erkenne die Kurve und lenke ein) oder muss ich unbedingt das Fahrzeug davor trainieren und somit Daten der Strecke "einsammeln".

Ich hoffe ich konnte mich gut ausdrücken.

LG
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du sagst es funktioniert, was genau meinst du damit? Denn wenn es das tut, dann musst du doch nichts mehr machen. “Trainieren” musst du doch nur, wenn etwas nicht geht.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Ich habe damit das Programm selbst gemeint. Ich hatte noch nicht die Gelegenheit es auf den Pi zu übertragen und es am Fahrzeug auszuprobieren.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kann man von hier aus nicht beurteilen. Wenn es lokal alles tut was es tun soll, und du Filmmaterial vom echten Roboter hast, dann ist das erstmal alles.
Antworten