Anzahl angeschlossener Kameras am RPi ermitteln

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
okliw994
User
Beiträge: 26
Registriert: Dienstag 11. Juni 2019, 09:49

Hallo zusammen,

Kann Python automatisch erkennen wie viele USB-Kameras am RPi angeschlossen sind?

Es handelt sich um einen Raspberry Pi 3 und ich programmiere in Python3. Angeschlossene USB-Geräte kann ich mir bereits ausgeben lassen:

Code: Alles auswählen

import subprocess

output = subprocess.check_output("lsusb")
output = output.decode('utf8')
usbid = output
print(usbid)
Allerdings komme ich ab hier nicht weiter, da ich nur die USB-Webcams benötige und verschiedene Webcam-Modelle anders bezeichnet werden. Somit kann ich auch nicht einfach den String vergleichen, da ich das Programm sonst nicht funktioniert wenn eine andere Webcam angeschlossen ist. Mir würde es reichen wenn ich eine Zahl als Integer erhalte, welche angibt wie viele Cams angeschlossen sind.

Zur Gesamtfunktion:
Der RPi nimmt automatisch Bilder auf. Allerdings sollen die Kameras austauschbar sein und jedes mal zu Beginn des Programms erkannt werden, wie viele Kameras angeschlossen sind, damit keine leeren Dateien geschrieben werden.

Ich hoffe ihr könnt mir helfen und entschuldigt meine Unwissenheit..

Gruß, okliw994
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Kannst du dir nicht die verschiedenen Strings der verschiedenen Webcam-Modelle merken und prüfen, wieviele davon enthalten sind? Bzw. nur solche, für die dein Programm dann auch tatsächlich funktioniert.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@okliw994: Ist das „USB“ denn so wichtig? Die Anzahl der erkannten Kameras sollte man durch auflisten/zählen von `/dev/video*` erkennen können. Also so etwas wie ``camera_count = len(glob.glob('/dev/video*'))``. Oder wenn Du OpenCV vewendest einfach `VideoCapture()`-Objekte erzeugen und schauen ob die `isOpened()` sind. Ich glaube maximale Anzahl ist unter Linux 64.

Wenn Du auch Qt5 verwenden willst/kannst, könnte `QCameraInfo` eventuell auch interessant sein.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich mache so etwas aehnliches fuer angeschlossene Massenspeicher und Netzwerkkarten via USB. Konkret verwende ich dazu pyudev um die Ereignisse zu bekommen, wenn da etwas an/abgesteckt wird, das ist aber auch "statisch" nutzbar. Es ist allerdings ein ziemliches rumgefummel, bei dem man viel ausprobieren muss. Dazu kann man zb mit 'udevadm monitor -pke' sich mal anschauen, was so passiert, wenn man eine USB Kamera anklemmt.
okliw994
User
Beiträge: 26
Registriert: Dienstag 11. Juni 2019, 09:49

Erstmal danke an euch alle für eure Antworten!

@Kebap
Das geht leider nicht. Das Programm soll über mehrere Jahre eingesetzt werden. Wenn im laufe der Zeit Kameras ausgetauscht oder erweitert werden kann ich die Strings derer jetzt noch nicht ahnen.

@_blackjack_
Das klingt alles sehr gut und genau nach dem was ich suche - Danke! Ich verwende sowohl opencv, als auch Qt5. Ich werde morgen früh gleich mal schauen ob ich das passend einbinden kann und melde mich dann noch mal ob's geklappt hat.

@_deets_
Auch dir danke für deine Antwort. Ich gucke mir das morgen früh auch mal genauer an und entscheide im Anschluss was sich für meine Kenntnisse am besten realisieren lässt!
okliw994
User
Beiträge: 26
Registriert: Dienstag 11. Juni 2019, 09:49

Guten Morgen,
@_blackjack_
Ich habe folgende Codes ausprobiert um mit die Anzahl der angeschlossenen Kameras auszugeben:
Code 1:

Code: Alles auswählen

import glob
import sys
import os

camera_count = len(glob.glob('/dev/video*))
print(camera_count)
Dabei hatte ich eine Maus, Tastatur, USB-Scanner, und eine Webcam angeschlossen und mir wurde ein Wert von 5 ausgegeben.

Code 2:

Code: Alles auswählen

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import PyQt5
import sys
import os

class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.online_webcams = QCameraInfo.availableCameras()
        print(online_webcams)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setApplicationName("Webcam")
    windwow = MainWindow()
    app.exec_()    
Bei diesem Code erhalte ich folgende Fehlermeldung: NameError: name 'QCameraInfo' is not defined


Kannst du erkennen wo mein Fehler liegt?

Gruß, okliw994
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man macht keine Sternchenimporte, insbesondere nicht bei Qt, wo man sich damit hunderte oder gar tausenden Namen in den Namensraum holt. Und man keine Ahnung hat, wo denn nun ein Name herkommt.

Und wenn du die Dokumentation zu QCameraInfo anschaust (https://doc.qt.io/qt-5/qcamerainfo.html) - in welchem Qt Modul kommt die vor? Und importierst du daraus etwas?
okliw994
User
Beiträge: 26
Registriert: Dienstag 11. Juni 2019, 09:49

Sorry ich bin noch nicht lange am programmieren und lerne jeden Tag was neues dazu. Daher kommt es allerdings auch oft dazu, das ich Sachen einfach ausprobiere und denke es wäre richtig oder Sachen aus dem Internet abschreibe...
Also muss ich aus QCameraInfo und QMultimedia importieren? Dabei bleibt die Fehlermeldung leider bestehen..
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte die GENAUE Fehlermeldung, und den dazugehoerigen Code zeigen.
okliw994
User
Beiträge: 26
Registriert: Dienstag 11. Juni 2019, 09:49

Code: Alles auswählen

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import PyQt5
import QCameraInfo
import QMultimedia
import sys
import os

class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.online_webcams = QCameraInfo.availableCameras()
        print(online_webcams)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setApplicationName("Webcam")
    windwow = MainWindow()
    app.exec_()    
Traceback (most recent call last):
File "/home/pi/kamerazaehler.py", line 9, in <module>
import QCameraInfo
File "/usr/lib/python3/dist-packages/thonny/backend.py", line 305, in _custom_import
module = self._original_import(*args, **kw)
ImportError: No module named 'QCameraInfo'
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das du Anfaenger bist erklaert aber nicht, das du nicht in der Lage sein solltest, auch mal ein bisschen durch die Dokumentation zu stoebern, und die Struktur von PyQt nachzuvollziehen. Die ganzen QtIrgendwas-Module importiert man mit "PyQt5.PyQtIrgendwas" - das ist mit QtCore so, mit QtGui, mit QtWidgets (die du alle schon benutzt). Und so ist es auch mit QtMultimedia.

Fuer mich funktioniert problemlos

Code: Alles auswählen

python3 -c 'from PyQt5.QtMultimedia import QCameraInfo; print(QCameraInfo.availableCameras())'
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und

https://doc.bccnsoft.com/docs/PyQt5/api ... ainfo.html

ist der erste Treffer, wenn man nach PyQt und QCameraInfo googelt. Da steht der komplette Pfad, wie man die Klasse findet.
okliw994
User
Beiträge: 26
Registriert: Dienstag 11. Juni 2019, 09:49

Sorry aber selbst wenn ich genau deinen Code abtippe meckert er direkt beim import:

ImportError: No module named 'PyQt5.QtMultimedia'


Ps:
Ich gebe mir ja wirklich mühe und will nicht auch nicht das man mir den kompletten Code vorschreibt. Aber wenn die Doku dann z.B. wieder in C++ geschrieben ist verwirrt mich das manchmal noch mehr..
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@okliw994: Dann ist das wahrscheinlich nicht installiert.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
okliw994
User
Beiträge: 26
Registriert: Dienstag 11. Juni 2019, 09:49

Ok dann muss ich wohl erstmal nach der fehlenden Installationsdatei suchen. Danke euch trotzdem!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich musste python3-pyqt5.qtmultimedia installieren.
okliw994
User
Beiträge: 26
Registriert: Dienstag 11. Juni 2019, 09:49

Guten Morgen,

Die Installation hat geklappt und es gibt keine Fehlermeldung mehr. Allerdings werden mir nur [] (eckige Klammern ohne Wert) ausgegeben..

Code: Alles auswählen

from PyQt5.QtMultimedia import QCameraInfo

print (QCameraInfo.availableCameras())
Langsam komme ich mir schon etwas blöd vor, dass ich das nicht selbst hinbekomme..
Trotzdem: weis jemand was ich noch falsch mache?

Gruß, okliw994
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Hier sagt jemand, bei ihm funktioniert es, wenn er vorher einmalig ein QCamera Objekt erzeugt.
okliw994
User
Beiträge: 26
Registriert: Dienstag 11. Juni 2019, 09:49

Das hatte ich schon versucht.. indem ich:

cam1 = cv2.VideoCapture(0)
cam2 = cv2.VideoCapture(1)

vor die Abfrage gesetzt habe. Leider bleibt die Ausgabe dabei unverändert..
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist ja aber auch nicht QCamera. Wenn das ein bug ist, dann kann man nicht davon ausgehen, dass man nur irgendwas irgendwie mit Kameras machen muss. Sondern schon genau das was da beschrieben wird.
Antworten