Navigation eines Autonomen-Roboters mittels Kamera

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Stimmt.
Wie auch immer, ich hab mir die Zeit genommen und es hinbekommen...
Habe jetzt allerdings ein Problem bei der Inbetriebnahme der Kamera.

Kriege an dieser Stelle jedesmal ein Fehlercode:
Bild

Hoffe das Bild ist noch leserlich.

Hab auch grad zusammen mit Kollegen eine Seite gefunden:
https://www.murtazahassan.com/courses/s ... pberry-pi/

Auch ein Video dazu:
https://www.youtube.com/watch?v=_wi2L-K ... 1A&index=2

In dem Video wird, so wie du es mir am Anfang gesagt hast, erzählt das man Daten sammeln muss um sozusagen das System zu trainieren. In seinem Video hat er aber nicht nur ein Webcam Modul sondern viele verschiedene. Muss ich das in diesem Falle auch tun oder reicht es wenn ich nur ein Modul für die Cam habe?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das capture funktioniert nicht. Du uebernimmst den Frame ungeprueft, und ohne auf 'success' zu testen, und beim imshow fliegt dir das dann um die Ohren.

Zuerst einmal musst du sicherstellen, dass deine Kamera am Pi ueberhaupt funktioniert. Mit irgendwelchen Programmen, welche die benutzen.

Wenn das geht, wuerde ich versuchen, mit picamera zu arbeiten. Das ist weniger komplex als OpenCV, und wenn es damit geht, dann hast du eigentlich schon gewonnen. Denn das kann auch numpy arrays liefern, und die wiederum stellen die Eingabe fuer OpenCV und seine Algoritmen dar. Ob du dann wirklich der Frage nachgehen willst, warum es mit OpenCV nicht geht, kannst du dir dann ueberlegen. Ich wuerd's ignorieren. Denn das kann viele Gruende haben, Fehlkonfiguration beim bauen zB. Da ranzugehen bedeutet ggf. seeeehr viel Zeit zu investieren, und du solltest dich auf deine eigentliche Aufgabe fokussieren.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Die Kamera habe ich bereits getestet. Ist schon paar Wochen her. Die Auflösung ist zwar nicht das Beste (habe ein leichtes lila-effect) aber sie funktioniert auf jedenfall.

Zu deinem Vorschlag. Ich bin da wie schon gesagt nicht so erfahren aber, mein Lehrer hat mir damals wie wir ihm von unserer Idee erzählt haben vorgeschlagen mit OpenCV zu arbeiten. Aber dennoch werde ich mich auf jedenfall schlauer machen und mir deinen Ratschlag genauer anschauen.

(In einem Video, dass ich von der selben Person habe, habe ich gesehen das er mit PyCharm auf einem PC programmiert und es dann auf sein Pi überträgt. Er hat sozusagen das selbe Projekt und auch alles Schritt für Schritt erklärt. Vielleicht wäre es keine schlechte Idee ihm zu folgen..)
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Problem mit all diesen Videos und Anleitungen da draussen: die sind *irgendwann* entstanden, und sehr oft finden die dort angegebenen Schritte so keine direkte Entsprechung mehr.

Und was die Anmerkung des Lehrers angeht: der hat schon recht, und OpenCV ist auch meine Wahl. Dabei geht es aber um die Algorithmen, die ihr zur Auswertung des Bildes nutzt. Wie genau aber die Kamera angesprochen wird, das hat damit ueberhaupt nichts zu tun. Wenn du das mit picamera machst, dann wirst du auch damit dann mit der OpenCV weiter arbeiten. Es geht wirklich nur darum, wie die Pixel-Daten in dein Programm kommen. Und picamera hat einfach viel viel viel weniger Konfiguration und Abhaengigkeiten, und wenn es damit geht, ist alles gut.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Hallo nochmals!

Wir sind relativ weit voran gekommen und sind mit dem Programmieren sogar fast fertig, allerdings nur "fast".
Für unser Programm müssen wir noch Videos bzw. Bilder aufnehmen um es um laufen bringen doch bis dahin haben wir noch ein wenig Zeit da wir erst heute den Lasercutter verwenden durften. Wie auch immer...

Ich wollte mein Programm Testen und bin dabei auf ein paar fehler codes gestoßen...

C:\Users\Moamm\PycharmProjects\DiplArbeit\venv\Scripts\python.exe C:/Users/Moamm/PycharmProjects/DiplArbeit/ColorPickerScript.py
Traceback (most recent call last):
File "C:\Users\Moamm\PycharmProjects\DiplArbeit\venv\lib\site-packages\numpy\__init__.py", line 305, in <module>
_win_os_check()
File "C:\Users\Moamm\PycharmProjects\DiplArbeit\venv\lib\site-packages\numpy\__init__.py", line 302, in _win_os_check
raise RuntimeError(msg.format(__file__)) from None
RuntimeError: The current Numpy installation ('C:\\Users\\Moamm\\PycharmProjects\\DiplArbeit\\venv\\lib\\site-packages\\numpy\\__init__.py') fails to pass a sanity check due to a bug in the windows runtime. See this issue for more information: https://tinyurl.com/y3dm3h86
Traceback (most recent call last):
File "C:\Users\Moamm\PycharmProjects\DiplArbeit\ColorPickerScript.py", line 1, in <module>
import cv2
File "C:\Users\Moamm\PycharmProjects\DiplArbeit\venv\lib\site-packages\cv2\__init__.py", line 5, in <module>
from .cv2 import *
ImportError: numpy.core.multiarray failed to import

Process finished with exit code 1

(Der ganze code passt nicht in ein Bild musste es deshalb einfügen)

Wir haben noch nicht die gelegenheit gehabt mit unserem Lehrer darüber zu sprechen da er noch krank ist und aus dem Grund auch nicht in der Schule sein kann. Deshalb wollte ich mich schon im vorhinein schlauer machen oder sogar das Problem mit Eurer Hilfe lösen.

Ich könnte euch unser Projekt (per Mail oder auch andere Möglichkeiten) schicken, was glaub ich auch besser ist da es ansonsten sehr unübersichtlich wäre.

LG
Emre
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Code gehört und Fehlermeldungen gehören immer in den Beitrag. Am besten zwischen Code-Tags. Bilder sind fürchterlich umständlich. Das war also richtig.

Das ist kein Fehler im Code sondern in der Bibliothek. Das scheint auch bekannt zu sein. Habt ihr euch mal die URL angeschaut, die in der Fehlermeldung steht?
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Ja hab ich, ich werde jetzt das ganze auf meinen Pi hochladen und dort nochmal ausprobieren.. Dort sollte alles schon installiert sein und auch funktionieren.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Hast du dir auch die Lösungen angeschaut und versucht? Damit sollte sich das Problem unter Windows beheben lassen - nämlich indem du Numpy in der Version 1.19.3 installierst. Und zwar so:

Code: Alles auswählen

pip install numpy==1.19.3
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Hallo nochmals,

wir haben soweit ein Programm und wollen es eigentlich nur noch testen. Letzte Woche haben wir bereits eine Strecke aufgebaut aus Papier welche wir ca. 4 Fingerbreit geschnitten haben. Allerdings fehlt unserem Fahrzeug noch einiges.. Wir haben bis jetzt nur die Motoren und die Räder drauf montiert so das wirs mit eigener Hand bewegen können. Uns fehlt aber noch die Halterung für die Kamera wo wir uns noch was einfallen lassen müssen (etwas einfaches am Anfang für die Aufnahme).

Wir haben bereits ein Video von der Strecke, ist allerdings nicht das beste da wir die Kamera mit eigener Hand halten mussten.. Wir arbeiten bereits am Pi und verwenden Pycharm.

Meine Frage wäre ob jemand weiß wie man das aufgenommene Video in Pycharm ins Programm einfügen kann. (Alles ist auf dem Pi, kann aber auch aufs PC übertreagen werden).

LG
Emre
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Emre: Die Frage hört sich komisch an. Man fügt keine Videos in Programme ein und was hat das mit der IDE zu tun? Das Video ist ja eine Datei. OpenCV kann Video-Dateien öffnen und die Einzelbilder daraus einlesen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Dann hab ich das wohl nicht ganz verstanden.. Hab in einem Youtube Video gesehen wie jemand ein Video eingefügt hat und so dann die ganzen Parameter für die Linien als auch die Farberkennung eingestellt hat.

Wie soll ich das sonst machen ?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na du lädst ein Video. Platzier es neben deinem Code & lade es, und lass deinen Algorithmus laufen.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Ich hab versucht das aufgenommene Video einzubauen mit dem folgenden Code einzubauen:

import numpy as np
import cv2

cap = cv2.VideoCapture('video.h264')

while(cap.isOpened()):
ret, frame = cap.read()

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()

Das Video aufrufen kann ich allerdings trotzdem nicht.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte die Code-Tags benutzen.

Bekommst du eine Fehlermeldung? Oder passiert einfach nichts? Kannst du das video irgendwo ablegen, so das man sich das mal anschauen kann?
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Ich könnte dir das Video per Mail weiterleiten, außer du hast eine bessere Idee..

Und ja, ich kriege folgende Fehlermeldung:

C:\Users\PycharmProjects\DiplomArbeit\venv\Scripts\python.exe C:/Users/PycharmProjects/DiplomArbeit/LaneDetectionModule.py
Traceback (most recent call last):
File "C:\Users\PycharmProjects\DiplomArbeit\LaneDetectionModule.py", line 9, in <module>
img = cv2.resize(img,(480,240))
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wvn_it83\opencv\modules\imgproc\src\resize.cpp:4051: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'


Process finished with exit code 1
__deets__
User
Beiträge: 14528
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: 14528
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?
Antworten