Astronomie

Python-Schnittstelle für DMK 23U274 USB-Kamera für Astrofotografie

Python-Schnittstelle für DMK 23U274 USB-Kamera für Astrofotografie

Ich habe Zugriff auf eine monochrome USB-Kamera (DMK 23U274, The Imaging Source) und möchte Brennebenenbilder von einem kleinen Teleskop mit einem Python-Skript aufnehmen, das es durch Einstellen von Belichtungszeiten und Auslösen von Bildaufnahmen steuert.

Idealerweise möchte ich dies auf einem Windows- oder MacOS-Laptop oder einem Raspberry Pi mit Raspbian Linux ausführen können, aber ich weiß nicht, ob dies drei verschiedene Sätze spezieller Software in der Mitte erfordern würde (DLLs oder was auch immer).

Gibt es plattformunabhängige Möglichkeiten, dies über USB zu tun? Wenn nicht, gibt es Python-Lösungen für Amateurastronomen, die auf mindestens einer oder zwei dieser Plattformen laufen?


Das einzige, was ich gefunden habe, ist dies, aber es ist spezifisch für Windows und scheint ein unvollendeter Python-Wrapper mit ungelösten Speicherleckproblemen zu sein:

aktualisieren: Ich habe auch den folgenden "Python-Wrapper für das IC Imaging Control SDK von The Imaging Source (TIS)" gefunden, der "nur unter Windows funktioniert, da eine DLL verpackt wird", sodass meine Hoffnung auf ein plattformunabhängiges Python-Paket schwindet.


Python-Schnittstelle für DMK 23U274 USB-Kamera für Astrofotografie - Astronomie

JetCam ist eine benutzerfreundliche Python-Kameraschnittstelle für NVIDIA Jetson.

Funktioniert mit verschiedenen USB- und CSI-Kameras mit Jetsons Accelerated GStreamer Pluginsson

Einfaches Lesen von Bildern als numpy Arrays mit image = camera.read()

Setzen Sie die Kamera auf Running = True, um Callbacks an neue Frames anzuhängen

JetCam erleichtert das Prototyping von KI-Projekten in Python, insbesondere innerhalb der in JetCard installierten Programmierumgebung Jupyter Lab.

Wenn Sie ein Problem finden, teilen Sie uns dies bitte mit!

JetCam wird mit einem System getestet, das mit dem JetCard-Setup konfiguriert wurde. Unterschiedliche Systemkonfigurationen können zusätzliche Schritte erfordern.

Nachfolgend zeigen wir einige Anwendungsbeispiele. Mehr finden Sie in den Notizbüchern.

Rufen Sie CSICamera auf, um eine kompatible CSI-Kamera zu verwenden. capture_width , capture_height und capture_fps steuern die Aufnahmeform und -rate, mit der Bilder erfasst werden. width und height steuern die endgültige Ausgabeform des Bildes, wie sie von der Lesefunktion zurückgegeben wird.

Rufen Sie USBCamera auf, um eine kompatible USB-Kamera zu verwenden. Es gelten die gleichen Parameter wie bei CSICamera, zusammen mit einem Parameter capture_device, der den Geräteindex angibt. Sie können den Geräteindex überprüfen, indem Sie ls /dev/video* aufrufen.

Rufen Sie read() auf, um das neueste Bild als numpy.ndarray vom Datentyp np.uint8 und shape (224, 224, 3) zu lesen. Das Farbformat ist BGR8.

Die Lesefunktion aktualisiert auch das interne Wertattribut der Kamera.

Sie können die Kamera auch auf running = True setzen, wodurch ein Thread erzeugt wird, der Bilder von der Kamera erfasst. Diese aktualisieren das Wertattribut der Kamera automatisch. Sie können mit der Traitlets-Bibliothek einen Rückruf an den Wert anhängen. Dadurch wird der Callback mit dem neuen Kamerawert sowie dem alten Kamerawert aufgerufen

Diese Kameras arbeiten mit der CSICamera-Klasse. Probieren Sie sie aus, indem Sie dem Beispielnotizbuch folgen.

Modell Infrarot Sichtfeld Auflösung Kosten
Raspberry Pi Kamera V2 62.2 3280x2464 $25
Raspberry Pi-Kamera V2 (NOIR) x 62.2 3280x2464 $31
Arducam IMX219 CS Objektivfassung 3280x2464 $65
Arducam IMX219 M12 Objektivfassung 3280x2464 $60
LI-IMX219-MIPI-FF-NANO 3280x2464 $29
WaveShare IMX219-77 77 3280x2464 $19
WaveShare IMX219-77IR x 77 3280x2464 $21
WaveShare IMX219-120 120 3280x2464 $20
WaveShare IMX219-160 160 3280x2464 $23
WaveShare IMX219-160IR x 160 3280x2464 $25
WaveShare IMX219-200 200 3280x2464 $27

Diese Kameras arbeiten mit der USBCamera-Klasse. Probieren Sie sie aus, indem Sie dem Beispielnotizbuch folgen.

Modell Infrarot Sichtfeld Auflösung Kosten
Logitech C270 60 1280x720 $18

JetBot - Ein pädagogischer KI-Roboter basierend auf NVIDIA Jetson Nano

JetRacer - Ein pädagogischer KI-Rennwagen mit NVIDIA Jetson Nano

JetCard - Ein SD-Karten-Image für die Webprogrammierung von KI-Projekten mit NVIDIA Jetson Nano


Python-Schnittstelle für DMK 23U274 USB-Kamera für Astrofotografie - Astronomie

Eine Sammlung von Unterstützungsroutinen für Kameras mit Python-Thread für

  • USB und interne Webcams
  • RTSP-Streams
  • MIPI CSI-Kameras (Raspberry Pi, Jetson Nano)
  • FLIR-Blackfly (USB)

Die Routinen verwenden hauptsächlich OpenCV oder PySpin als Schnittstelle zur Kamera. Die Hauptbemühung bei diesen Routinen besteht darin, die Bilderfassung in einem Hintergrundthread auszuführen und die besten Ansätze für maximale Framerate und minimale Latenz zu finden.
Diese Arbeit basiert auf Bemühungen von Mark Omo und Craig Post.

[*] RTSP erfordert gstreamer-Integration. CV2 muss unter Windows angepasst werden, um die Unterstützung von gstreamer zu aktivieren. Siehe meine Windows-Installationsskripte auf Github.

blackflyCapture

Vereinfacht die für die Blackfly-Kamera erforderlichen Einstellungen.
Unterstützt Trigger-Out während der Frame-Belichtung und Trigger-In für Frame-Start.
Optimierte Einstellungen, um mit S BFS-U3-04S2M die volle Bildrate zu erreichen.

nanoCapture

Verwendet die gstreamer-Pipeline für Jetson Nano.
Pipeline für die nvidia-Konvertierung und die nvarguscamera-Aufnahme.
Einstellungen optimiert für Sony IMX219 Raspi v2 Module.

Verwendet die CV2-Capture-Architektur.
Das Video-Subsystem wird basierend auf dem Betriebssystem ausgewählt.

rtspCapture

gstreamer-basierte rtsp-Netzwerk-Stream-Erfassung für alle Plattformen.
gstreamer wird über OpenCV aufgerufen.
Standardmäßig unterstützt OpenCV ffmpeg und nicht gstreamer. Jetson Nano unterstützt kein ffmpeg, aber opencv ist mit gstreamer für diese Plattform vorgefertigt.

Schnittstelle für Picamera-Modul. Ausgelaufen, da cv2Capture für den Raspberry Pi effizienter ist.

Anzeige: Im Allgemeinen sollte die Anzeige im Hauptprogramm erfolgen. OpenCV erfordert die Ausführung von Waitkey, um die Anzeige zu aktualisieren. Waikey dauert viel länger als 1 ms und daher wird die Übertragung von Daten zwischen Threads im Hauptthread erheblich verlangsamt, wenn eine Anzeige angefordert wird.

Warteschlange: Der Datentransfer zwischen Threads oder zwischen Hauptprogramm und Thread funktioniert mit Queue besser als mit dem Setzen neuer Datenfalgs und dem Zugriff darauf über Shared Memory. Die Warteschlange kann so programmiert werden, dass sie blockierend oder nicht blockierend ist, und wenn die Warteschlangengröße lang genug ist, gehen keine Daten verloren, wenn der Haupt-Thread für kurze Zeit nicht mit dem Capture-Thread mithalten kann.

test_blackfly.py testet das Blackfly-Capture-Modul und meldet die Framerate.

test_blackfly_display.py testet das Blackfly-Capture-Modul, zeigt Bilder* an und meldet die Framerate.

test_blackfly_savehdf5.py wie oben, keine Anzeige, aber Speichern auf Festplatte.

test_camera.py vereinheitlicht die Kameraaufnahme für alle Aufnahmeplattformen außer Blackfly.

test_rtsp.py Testen von rtsp-Netzwerkstreams.

test_display.py testet die Opencv-Anzeige-Framerate

test_savehd5.py testet den Festplattendurchsatz mit hdf5

test_sum.py Testen verschiedener Ansätze zur Berechnung der Integral/Helligkeit eines Bildes

test_arraycopy.py testet, welche Achse für die Zeit verwendet werden sollte

Sony IMX287 FLIR Blackfly S BFS-U3-04S2M

  • auto_exposure 0: automatisch, 1:manuell
  • Belichtung in Mikrosekunden
  • Maximale Auflösung 2592x1944
  • YU12, (YUYV, RGB3, JPEG, H264, YVYU, VYUY, UYVY, NV12, BGR3, YV12, NV21, BGR4)
  • 320x240 90fps
  • 640x480 90fps
  • 1280x720 60fps
  • 1920x1080 6.4fps
  • 2592x1944 6.4fps
  • auto_exposure 0: automatisch, 1:manuell
  • Belichtung in Mikrosekunden
  • Maximale Auflösung 3280x2464
  • YU12, (YUYV, RGB3, JPEG, H264, YVYU, VYUY, UYVY, NV12, BGR4)
  • 320x240 90fps
  • 640x480 90fps
  • 1280x720 60fps
  • 1920x1080 4.4fps
  • 3280x2464 2.8fps
  • 320x240, 30fps
  • YUY2
  • automatische Belichtung? 0,25, 0,74 -1. 0
  • WB_TEMP 4600
  • 1280x720, 30fps
  • 620x480, 30fps
  • 960x540, 30fps

Python-Schnittstelle für DMK 23U274 USB-Kamera für Astrofotografie - Astronomie

Wenn Sie verwenden Python-Foto-App und du siehst die Kamera im Wählen Sie ein Videogerät aus Dialog, der beim Starten der App angezeigt wird, sollte die Kamera in jeder Anwendung verfügbar sein, die Direct Show verwendet.

Ich habe eine Logitech C270-Kamera an ein Windows 10-System angeschlossen.

Wenn ich Ihren Code ausführe und die Kamera auswähle, drücke OK, ich sehe das Bild für einen Moment, dann wird das Programm einfach beendet, es wird kein Fehlercode angezeigt.

Dies geschieht unabhängig davon, ob ich den Code im Idle-Editor oder direkt über die Eingabeaufforderung ausführe.

Betrachten Sie zur Verdeutlichung dieses Beispiel 2 Kameras sind zu Beginn an den Computer angeschlossen. Wenn die Anwendung startet, wird eine Geräteliste von get_input_devices() abgerufen und angezeigt, damit der Benutzer die Kamera auswählen kann. Nach der Auswahl wird die Kamera physisch getrennt und die Funktion get_input_devices () erneut (programmgesteuert) aufgerufen. Würde sie jetzt 1 Kamera wie gewünscht oder 2 wie beim Start zurückgeben?

Danke für deine Antwort. Ja, andere Beispiele funktionieren auf meinem PC. Tatsächlich muss ich die UVC-Eigenschaften auflisten und den Weißabgleichswert mit dhsow ändern, anstatt das Dialogfeld zu ändern, muss ich die Argumente analysieren. Bitte helfen Sie mir mit einigen Beispielen oder Ideen, Vielen Dank im Voraus.

Irgendwelche Updates zu diesem Thema?
Ich erhalte einen ähnlichen Fehler, wenn ich versuche, main.py auszuführen
Amcap funktioniert einwandfrei und die anderen Beispielcodes auch

gibt es eine möglichkeit die auflösung zu erhöhen? sieht so aus, als ob alles nur in 640x480 . funktioniert

und wenn das Programm geöffnet ist und ich Kamera und Peoperties auswähle und "Übernehmen" und "OK" wähle, wird das Programm vollständig geschlossen!

Veröffentlichen Sie Ihre E-Mail-Adresse niemals in einem Forum, es sei denn, Sie mögen Spam! Wenn Ihnen jemand antwortet, erhalten Sie eine E-Mail, um Sie darüber zu informieren.

Bitte nicht erneut posten, wenn Ihre Frage nicht sofort auftaucht: Diese wurden moderiert und mussten von einem Menschen zur Veröffentlichung überprüft werden. Um zu verhindern, dass Sie als Spammer abgestempelt werden, musste beides akzeptiert werden, und dann muss ich die Spares bereinigen. Bitte haben Sie ein wenig Geduld!
Die andere Version habe ich gelöscht.

Hallo, können Sie bitte erläutern, was Sie mit OpenCV-Betrieb meinen? Bitte geben Sie auch an, was Sie tun möchten.

Danke für deine Antwort. Ich programmiere ein Bilderkennungsskript in Python und OpenCV. Die Idee ist, den Rahmen von Nintendo Switch einzufangen und dann einige Elemente eines Pokémon-Kampfes auszublenden. Das Problem ist, dass insbesondere einige HDMI-Capture-Karten von OpenCV nicht erkannt werden Avermedia LGP. Ich habe auf der Avermedia-Website gelesen, dass Directshow verwendet wird, damit ich hierher komme.

Problem: Einige Avermedia Capture-Karten verwenden Directshow und ich kann mit OpenCV keine Frames von ihnen abrufen.

Mein Skript macht das:
Nimmt einen Frame auf: cv2.VideoCapture() und capture.read()
Ändert die Größe, verwischt es, beschneidet es: cv2.resize() und Arrays
Farbmaskieren Sie es und überlagern Sie benutzerdefinierte Bilder über den Rahmen: cv2.bitwise_and(), cv2.bitwise_not(), cv2.add()

Was ich tun möchte: Nehmen Sie einen Directshow-Frame (von Avermedia Capture-Karten) und wenden Sie diese Funktionen auf den Frame an.

Hier ist mein Skript, wenn Sie einen Blick darauf werfen möchten: PokemonHideInfo.py - Google Drive[^]

Danke für die ausführliche Antwort

OpenCV verarbeitet die Bilddaten mit einem numpy-Array. Wenn die Bilddaten also in Form eines numpy-Arrays vorliegen, kann OpenCV sie anzeigen/verarbeiten. Woher Sie das numpy-Array erhalten, spielt keine Rolle, solange sie eine gültige Form und einen gültigen Datentyp haben. Sie können es auch selbst überprüfen, indem Sie ein Array mit numpy Nullen in einer bestimmten Form erstellen, z. (300,300,3) und übergeben Sie es an cv2.imshow() und es wird ein schwarzes Bild angezeigt.

Um auf Ihr Problem zurückzukommen, ich habe den Code in Beispiel 3 geändert, um Ihren Anforderungen besser gerecht zu werden:

Die Funktion xyz empfängt den Rahmen, damit Sie in dieser Funktion alle gewünschten Verarbeitungen durchführen können. Denken Sie daran, dass der obige Code keinen Code enthält, um den Timer zu stoppen und das Programm sicher zu beenden, sodass Sie an diesem Teil arbeiten müssen.

Allgemeine Nachrichten Vorschlag Frage Fehler Antwort Witz Lob Rant Admin

Verwenden Sie Strg+Links/Rechts, um Nachrichten zu wechseln, Strg+Oben/Unten, um Threads zu wechseln, Strg+Umschalt+Links/Rechts, um Seiten zu wechseln.


Astrofotografie kann viele Daten produzieren – egal, wo es um die Bildgebung des Sonnensystems mit mehreren großen AVI- oder SER-Dateien oder die glückliche Bildgebung mit DS-CMOS-Kameras bei kurzen Belichtungen mit vielen großen FITS-Dateien geht. Die Bearbeitungszeit kann dann zu einem großen Problem werden. Lassen Sie uns ein Benchmarking verschiedener Verarbeitungsaufgaben durchführen.

Die Jupiter-Imaging-Saison ist in vollem Gange, während der Mond auch nirgendwo hingeht. Es gibt weniger bekannte Möglichkeiten, diese Objekte zu fotografieren, die ich hier erkunden möchte.


38 Gedanken zu &ldquo Budget-Astrofotografie mit einem Raspberry Pi &rdquo

Ich scheine mich daran zu erinnern, dass die augapfelförmige Webcam, die Mitte der Nuller herauskam, einen geerdeten Stift im Inneren hat, der ihr eine “bulb”-Einstellung geben würde, d. h. Perfekt für Astrofotografie. Beschissene Auflösung und wahrscheinlich nicht besser als das, was in einem Samsung-Handykamera-Video aufgenommen wird.

Ah, die alte BW Quickcam. Es waren echte CCD-Geräte mit Druckeranschluss (kein USB) und ohne Farbfilter auf dem Chip. Hobbyastronomen machten damit Langzeitbelichtungen in Peltier-gekühlten bearbeiteten Gehäusen. Niedrige Auflösung und laut, wenn nicht auf -20 ° C gekühlt, aber einige Leute haben erstaunliche Farbzusammenstellungen (mit manuellen Filtern) und Mehrfachbelichtungen von Planeten und Nebeln genäht.

Eine längere Belichtungszeit ist wirklich nicht erforderlich. Nehmen Sie einfach viele kürzere Belichtungen auf und stapeln Sie sie in der Software. Dies hat den zusätzlichen Vorteil, dass die weniger genaue Verfolgung ausgeglichen wird.

Nein. Jedes Mal, wenn Sie Aufnahmen hinzufügen, fügen Sie bei jeder Aufnahme auch Leserauschen hinzu. Die schwächeren Details gehen verloren. Warum geben Astrofotografen Ihrer Meinung nach 1000 US-Dollar für ihre Montierungen aus, um immer längere Belichtungen zu erzielen?

Erst kürzlich erschienen CCD-Kameras (ASI1600), deren Leserauschen klein genug ist, so dass das Stapeln vieler kürzerer Belichtungen praktikabel wird. Und mit kürzer meine ich immer noch 1 Minute oder so, aber das hängt stark vom Ziel / Umfang / etc. ab.

Bearbeiten: Ich meinte, dass erst kürzlich CMOS-Kameras erschienen sind…

Stapeln erhöht tatsächlich das SN-Verhältnis, es ist eine sehr häufig verwendete Praxis in der Astrofotografie, um das Rauschen zu reduzieren und die Details zu erhöhen, die Sie in Ihren Bildern sehen, selbst bei den von mir verwendeten Teleskop-/Kamerasystemen über 75.000 USD. Google Registax für Software dazu und eine Erklärung, warum es funktioniert.

Stapeln erhöht tatsächlich das SN-Verhältnis, es ist eine sehr häufig verwendete Praxis in der Astrofotografie, um das Rauschen zu reduzieren und die Details zu erhöhen, die Sie in Ihren Bildern sehen, selbst bei den von mir verwendeten Teleskop-/Kamerasystemen über 75.000 USD. Google Registax für Software dazu und eine Erklärung, warum es funktioniert.

“Wenn er nicht zu Hause ist, hat [Bowling] seinen Pi als drahtlosen Zugangspunkt eingerichtet, sodass der Pi eine Vorschau an sein Telefon oder Tablet senden kann, um Anpassungen vorzunehmen, bevor ein Bild aufgenommen wird.”

Hoffentlich ist das IoT vollständig gesichert.

Oh nein, sie haben mein Bild vom Himmel gestohlen!

IoT (Internet der Teleskope)

War dieser Kommentar notwendig?

Wenn ich seine Projektdetails lese und sehe, was er getan hat, um dieses Projekt aufzubauen, denke ich, dass er sich der Probleme der Sicherheit und der Verbindung von Dingen mit dem Internet sehr wohl bewusst ist.

Es ist nicht mit dem Internet verbunden, obwohl ich mir darüber Gedanken gemacht habe :-) Als AP zu fungieren macht es einfach, eine Verbindung herzustellen, wenn ich es an einen dunklen Ort bringe, so dass Sie es nicht manuell tun müssen Stellen Sie die Netzwerkparameter auf dem Gerät ein, von dem aus Sie eine Verbindung herstellen.

Das ist gut. Ich bin sicher, dass es einige interessante Dinge gibt, die getan werden können, wenn man Teleskope miteinander vernetzt. Ganz zu schweigen davon, den Spaß mit denen zu teilen, die sich kein Teleskop leisten können.

Fantastische – Liebesprojekte wie dieses –, das Beste aus dem zu machen, was du herumliegen hast

Sieht so aus, als würde die alte 5-MP-Kamera immer noch verwendet. Die neue (V2) 8MP Kamera wäre ein nettes Upgrade, nicht nur wegen der höheren Auflösung, sondern auch wegen der verbesserten Bildqualität.

Sie müssen die genauen Sensorspezifikationen kennen, um festzustellen, dass Sie, wenn Ihre Siliziumplatte ein Viertel der Fläche ausmacht, offensichtlich nur ein Viertel der Photonen einfangen werden, die Sie mit der alten Platte gemacht haben. Bei hellen Bildern kein Problem, bei schwachen Bildern kein Problem.

Ja, da beide Sensoren ungefähr die gleiche Größe haben, hat der 8MP-Sensor kleinere Pixel. Der Unterschied beträgt 1,25 um^2 versus 1,96 um^2, was dir ergibt

50% größere Pixel für den 5MP-Sensor. Aber der 5-MP-Sensor (Omnivision OV5647) ist ein ziemlich altes Design, während die 8MP-Version den relativ neuen Sony IMX219-Sensor verwendet, der in vielerlei Hinsicht überlegen sein sollte. Leider gibt es nicht allzu viele “harte Daten” aus den Datenblättern, die tatsächlich direkt zwischen beiden Sensoren verglichen werden könnten, aber viele Leute, die beide Sensoren ausprobiert haben, berichten von verbesserten schlechten Lichtverhältnissen und einem besseren Signal-Rausch-Verhältnis für den neuen Kamera-Modul.

Sie sind auf 6-Sekunden-Belichtungen beschränkt

Es muss doch einen Weg um diese Grenze geben, irgendjemand?…

Dies ist kein Film, so dass eine Langzeitbelichtung dem Bildsensor in der Kamera sicherlich nicht nützt.
Im Film erhalten Sie eine Ansammlung von Photonen, die im Laufe der Zeit mehr Details ergeben.
Aber ich hätte nicht gedacht, dass ein Bildsensor so funktioniert.
Ich dachte, es macht einfach immer wieder Bilder und fasst sie zusammen.
Grundsätzlich mehrere Bilder zusammenführen.
Sie können also Ihre “Exosure” erhöhen, indem Sie einfach mehr Bilder aufnehmen und diese zu einem einzigen überlagerten Composite verarbeiten. Ihnen eine Belichtung so lange geben, wie Sie möchten.

Das klingt besser, als ich es mir vorgestellt habe. Ich denke, ich werde etwas darüber nachforschen, wie CCDs genau erfassen, es sei denn, jemand postet einen Link, wenn ich aufwache…

Habe das aber gefunden: https://sites.google.com/site/meteotuxpi/home
Im Grunde, was Sie gesagt haben, mehrere kurze Belichtungen zu einer zu kombinieren.

Mit einem idealen Sensor ohne Rauschen, ja. Es gibt jedoch immer ein gewisses Grundrauschen, unterhalb dessen Sie kein brauchbares Signal wiederherstellen können. Da die meisten Objekte im Weltraum ziemlich dunkel sind (außer Planeten/Mond), fangen Sie nicht viele Photonen ein. Sie müssen sicherstellen, dass Ihre Einzelbelichtungen lang genug sind, um den schwächsten Teil, den Sie abbilden möchten, über diesen Grundrauschen zu bringen. Dann können Sie, wie Sie bereits sagten, mehrere Aufnahmen zusammenführen oder „stapeln“, um Ihr Signal-Rausch-Verhältnis zu erhöhen und diese wunderschönen Galaxien und Nebel hervorzubringen, die sonst nie zu sehen wären!

Das ist die beste Erklärung für das Stapeln, die ich bisher gesehen habe. Vielen Dank!

Echte Astrofotografie-Kameras werden auf etwa -30 °C gekühlt, um das Rauschen zu reduzieren ( http://diffractionlimited.com/product/stt-8300/ ). Sie nehmen auch Darkframes, um Pixel zu kompensieren, die rauschender sind als andere, und Flatframes, um die ungleichmäßige Ausleuchtung des Bildes über den Sensor auszugleichen. Und Sie stapeln stundenlange Belichtungen, indem Sie eine ziemlich raffinierte Software verwenden, die die Bilder automatisch neu ausrichten kann, nachdem das Bild auf dem Sensor aufgrund von Unvollkommenheiten in der Polarausrichtung der Teleskophalterung und der Führungsmotorgeschwindigkeit unvermeidlich driftet. Sie verbringen dann Stunden damit, das Bild zu bearbeiten und versuchen, schwache Signale aus den Hügeln von Hintergrundgeräuschen zu ziehen.

Es ist wirklich ein ziemlich komplizierter Prozess, den ich früher gemacht habe, bis ich festgestellt habe, dass ich ein besseres Leben habe, wenn ich etwas Schlaf bekomme.

Das ist nur ein Teil der Geschichte und die Vereinfachung kann in einigen Fällen irreführend sein und tatsächlich zu schlechteren Qualitätsmessungen führen.
Sie müssen nicht ’ das Signal von unterhalb des Rauschbodens wiederherstellen”, es ist immer nur eine Frage des Signal-zu-Rausch-Verhältnisses. Allgemein:
Signal = Isignal * tex * Nexp,
Rauschen = sqrt(Idark *texp *Nexp + qread * Nexp)
Sie haben also SNR = Isignal * texp * Nexp / sqrt(Idark *texp *Nexp + qread * Nexp)

Mit anderen Worten, es ist Ihrem Detektor egal, ob Sie Dunkelstrom oder Signal integrieren, oder Sie integrieren 1x 100s oder 100x 1s – das integrierte Signal ist Isignal x 100s und die integrierte Rauschladung ist in beiden Fällen Idark x 100s Elektronen.
Der Unterschied ist jedoch das Leserauschen: In einem nicht-sphärischen Kuh-im-Vakuum-Detektor entstehen bei jedem Auslesen zusätzliche Rauschelektronen, daher haben Sie in unserem Beispiel in beiden Fällen das gleiche Signal, aber a but Rauschen von sqrt(Idark x 100s + qread) im einen Fall, sqrt(Idark x 100s+ 100x qread) im anderen.

*Deshalb lohnt es sich normalerweise, länger als öfter zu belichten.

Allerdings sind die Dinge kompliziert, z.B. durch die Tatsache, dass Detektoren ein beliebig großes Signal nicht halten können, sodass Sie nicht beliebig lange integrieren können. Es gibt Fälle, in denen dies so einschränkend ist, dass der Detektor sehr schnell von Dunkelstrom gesättigt wird. Sie sollten also oft und nicht lange lesen! Auf der anderen Seite können Sie Detektoren oft auf Werte kühlen, bei denen der Dunkelstrom vernachlässigbar wird (wenige oder sogar weniger als eine e-pro Belichtung) und Tricks mit der Auslesung spielen (z Leserauschen wird vernachlässigbar. Beide kommen mit einer erhöhten Komplexität und auch mit ihren eigenen Vorbehalten, die die Leistung in einigen Bereichen einschränken.

Obwohl das Stapeln von Webcam-Bildern in einem Hobby-Astrofoto-Setup nicht so gut ist wie Langzeitbelichtungen mit einem gekühlten CCD, hängt die beste Messung am Ende -wie immer- von Ihrem genauen Messproblem und Ihrer Einstellung ab…

Das ist nicht richtig.
Sowohl Film als auch Elektronik profitieren von längeren Belichtungszeiten. Die Photosites von Sensoren erzeugen eine lineare Reaktion (die Intensität des Bildes an jedem Pixel ist proportional zur Anzahl der Elektronen, die auf sie treffen). Der grundlegende Unterschied zum Film besteht darin, dass Emulsionskörner (natürlich) eine logarithmische Reaktion aufweisen, außer wenn das Bild unter- oder überbelichtet ist.


Die verschiedenen xiAPI-Parameter können mit XIMEA-Python-Funktionen gesetzt oder ausgelesen werden, die aus den konstanten String-Definitionen der xiAPI-Parameter generiert werden.

Enumeratorparameter¶

Präfixe erhalten_ und einstellen_ werden der Konstanten-String-Definition wie folgt hinzugefügt:
Für Parameter XI_PRM_ACQ_TIMING_MODE, acq_timing_mode ist der konstante String, daher enthält die Python XIMEA API Funktionen get_acq_timing_mode() und set_acq_timing_mode():

Der zurückgegebene Wert ist ein String, daher könnte die Überprüfung des zurückgegebenen Werts ein Vergleich mit einem anderen String sein:

Nichtboolesche Parameter¶

Präfixe erhalten_ und einstellen_ werden auf die gleiche Weise wie für Enumeratorparameter hinzugefügt:
Z.B. für Parameter XI_PRM_EXPOSURE, "Exposition" ist der konstante String, daher enthält die Python XIMEA API Funktionen get_exposure() und set_exposure():

Um den Parameter XI_PRM_FRAMERATE auf 10 zu setzen, lauten die Befehle:

Beachten Sie, dass der Wert XI_ACQ_TIMING_MODE_FRAME_RATE funktioniert nur mit MQ- und MD-Kameras. Weitere Informationen zum Einstellen der festen Framerate finden Sie im xiAPI-Handbuch und in unserem Knowledgebase-Artikel Frame Rate Control.

Boolesche Parameter¶

Dieselbe Logik wird für boolesche Parameter verwendet, wobei Präfixe ist_, aktivieren_ und deaktivieren_ werden wie folgt verwendet:
Für Parameter XI_PRM_HORIZONTAL_FLIP, "horizontal_flip" ist der konstante String, daher enthält die Python XIMEA API Funktionen is_horizontal_flip(), enable_horizontal_flip() und disable_horizontal_flip():

Gemeinsame Schnittstelle¶

Zum Einstellen oder Abrufen von Parametern können verwendet werden get_param(arg) und set_param(arg) Funktionen, wobei wie arg wird die konstante Zeichenfolge eines bestimmten Parameters wie folgt verwendet:

Beide Ansätze sind gültig.


Es gibt eine Reihe von API-Funktionen, die auf die ArduCAM USB-Kamerahardware zugreifen.

4.1.Datenstrukturen

Es gibt wichtige Datenstrukturen, die von der SDK-Bibliothek für die Kamerakonfiguration verwendet werden.

4.1.1 ArduCamCfg-Datenstruktur-Mitglieder

u32Kameratypunsigniert lang, für zukünftige Verwendung reserviert
u32Höheunsigned long, die Höhe des Videostreams
u32Breiteunsigned long, die Breite des Videostreams
u8PixelBytesunsigned char, die Anzahl der Bytes eines Pixels
u8PixelBitsunsigned char, die Bittiefe pro Pixel
emI2cModusEnum-Typ i2c_mode, I2C-Protokoll für den Sensor
u32I2cAddrunsigned long, I2C-Slave-Adresse für den Sensor
u16Vidunsigned short, der Herstellercode der Kamera
usbTypunsigniertes Zeichen, USB-Kameraversion
emImageFmtModeAufzählungstyp format_mode,Bildformat
u32Größeunsigned long, Die Größe der empfangenen Daten, die hauptsächlich für JPG-Daten verwendet werden

Die SDK-Bibliothek unterstützt 4 verschiedene I2C-Modi. Zum Beispiel ist I2C_MODE_8_8 für 8-Bit-Register und 8-Bit-Registerwert, I2C_MODE_8_16 ist für 8-Bit-Register und 16-Bit-Registerwert.

Die SDK-Bibliothek unterstützt 7 verschiedene Bildformatmodi.

4.2 Funktion

4.2.1 Allgemeine Funktion

4.2.1.1 Py_ArduCam_autoopen(cfg )

Diese Funktion wird verwendet, um die unterstützten Kameras automatisch zu öffnen, wenn die erste Kamera auf dem USB-Bus gefunden wird, die dem Herstellercode der Kamera in der ArduCamCfg-Struktur entspricht.

Param 1: ArduCamCfg Strukturinstanz Rückgabewert: Fehlercode, Handle,cfg

4.2.1.2 Py_ArduCam_scan()

Scannen Sie, wie viele unterstützte Kameras auf dem USB-Bus verfügbar sind, und geben Sie den Kameraindex und die Kameraseriennummer zurück.

Rückgabewert: Anzahl der unterstützten Kameras, Indizes, Seriennummern

4.2.1.3 Py_ArduCam_open(cfg,index)

Es wird häufig mit der Scanmethode verwendet und öffnet die Kamera mit dem Kameraindex. Param 1: ArduCamCfg-Strukturinstanz

Param 2: Index der Kamera, Handle,cfg Rückgabewert: Fehlercode

4.2.1.4 Py_ArduCam_close( handle )

Schließen Sie die aktuelle Kamera am Kameragriff. Param 1: Handle zur USB-Kamerainstanz Rückgabewert: Fehlercode

4.2.1.5 Py_ArduCam_getSensorCfg( handle )

Rufen Sie den Konfigurationsparameter der USB-Kamerainstanz ab. Param1: Handle auf die USB-Kamera-Instanz

Rückgabewert: Fehlercode,cfg

4.2.1.6 Empfohlenes Betriebsverfahren

4.2.2 Bildaufnahmefunktion

4.2.2.1 Py_ArduCam_beginCaptureImage(handle )

Erstellen und bereiten Sie die Aufgabenliste für die Bilderfassung vor. Param 1: Handle auf die USB-Kamera-Instanz Rückgabewert: Fehlercode

4.2.2.2 Py_ArduCam_captureImage( handle )

Starten Sie eine Bildaufnahmeaufgabe.

Param 1: Handle auf die USB-Kamera-Instanz Rückgabewert: Fehlercode

4.2.2.3 Py_ArduCam_endCaptureImage( handle )

Löschen Sie die Aufgabenliste für die Bildaufnahme.

Param 1: Handle auf die USB-Kamerainstanz Rückgabewert: Fehlercode

4.2.2.4 Empfohlene Vorgehensweise

4.2.3 Bildlesefunktion

4.2.3.1 Py_ArduCam_availableImage( handle )

Prüfen Sie, ob das Bild im Bild-FIFO zum Lesen verfügbar ist. Param 1: Handle auf die USB-Kamera-Instanz

Rückgabewert: Anzahl der verfügbaren Bilder

4.2.3.2 Py_ArduCam_readImage( handle)

Lesen Sie eine Bilddaten aus dem Bild-FIFO. Param 1: Handle auf die USB-Kamera-Instanz Rückgabewert: error code, data,cfg

4.2.3.3 Py_ArduCam_del( handle )

Löschen Sie die Bilddaten aus dem Bild-FIFO. Param1: Handle auf die USB-Kamerainstanz Rückgabewert: Fehlercode

4.2.3.4 Py_ArduCam_flush( ArduCamHandle useHandle )

Löschen Sie alle Bilddaten aus dem Bild-FIFO. Param1: Handle auf die USB-Kamerainstanz Rückgabewert: Fehlercode

4.2.3.5 Empfohlene Vorgehensweise

4.2.4 Sensorregister-Zugriffsfunktion

4.2.4.1 Py_ArduCam_writeSensorReg( handle, regAddr, val )

Schreiben Sie das Sensorregister.

Param 1: Handle auf die USB-Kamera-Instanz Param 2: die zu schreibende Registeradresse Param 3: zu schreibender Wert

4.2.4.2 Py_ArduCam_readSensorReg(handle, regAddr )

Param 1: Handle auf die USB-Kamera-Instanz Param 2: die zu lesende Registeradresse Rückgabewert: Fehlercode, regValue

4.2.5 Benutzerdatenzugriffsfunktion

Es gibt 1024 Byte Flash-Speicher zum Speichern von benutzerdefinierten Daten.

4.2.5.1 Py_ArduCam_writeUserData( handle,u16Addr, u8Len,data )

Schreiben Sie Daten in die Benutzerregion.

Param 1: Handle auf die USB-Kamera-Instanz

Param 2: zu schreibende Benutzerregionsadresse, Bereich von 0

Param 3: zu schreibende Datenlänge (Länge≤32,Adresse+Länge≤1024) Param 4: zu schreibende Daten

4.2.5.2 Py_ArduCam_readUserData( handle, u16Addr, u8Len )

Schreiben Sie Daten aus der Benutzerregion.

Param 1: Handle auf die USB-Kamera-Instanz

Param 2: zu lesende Benutzerregionsadresse, Bereich von 0

Param 3: zu lesende Datenlänge (Länge≤32,Adresse+Länge≤1024) Rückgabewert: Fehlercode,Daten

4.2.6 Konfiguration der Kameraplatine

Die Board-Konfigurationsfunktion wird verwendet, um die richtigen Register- oder Firmware-Werte für verschiedene Arbeitsmodi auf die Hardware einzustellen. Siehe Abschnitt 5 für Details.

4.2.6.1 Py_ArduCam_setboardConfig( handle, u8Command, u16Value, u16Index, u32BufSize, data )

Schreiben Sie die Konfigurationsdaten der Platine.

Param 1: Handle auf die USB-Kamerainstanz Param 2: Vendor-Befehlscode

Param 3: Vendor-Befehlswert Param 4: Vendor-Befehlsindex Param 5: Datenpuffergröße

4.2.7 Externer Trigger

Der externe Triggermodus erfordert die neueste Hardware- und Firmware-Unterstützung. Wenn die Firmware-Version keine externe Triggerung unterstützt, wird die folgende Funktion zurückgegeben: USB_BOARD_FW_VERSION_NOT_SUPPORT_ERROR

4.2.7.1 Py_ArduCam_setMode(handle,mode)

Mit dieser Funktion wird der Arbeitsmodus zwischen externem Triggermodus und kontinuierlichem Modus eingestellt.

Param 1: Handle auf die USB-Kamera-Instanz

Param 2: Modus EXTERNAL_TRIGGER_MODE oder CONTINUOUS_MODE

4.2.7.2 Py_ArduCam_isFrameReady(handle)

Diese Funktion prüft, ob ein Frame zum Lesen bereit ist. Param 1: Handle auf die USB-Kamera-Instanz

Rückgabewert: 1 ist bereit oder 0 ist nicht bereit

4.2.7.3 Py_ArduCam_softTrigger(Handle)

Diese Funktion wird verwendet, um die Kamera zum Aufnehmen von Bildern per Software auszulösen, anstatt über den externen Triggereingang.

Param 1: Handle auf die USB-Kamera-Instanz Rückgabewert: Fehlercode

4.2.7.4 Py_ArduCam_getSingleFrame(handle,time_out=1500)

Diese Methode kann verwendet werden, um einen einzelnen Frame im Software- oder externen Triggermodus zu lesen. Param 1: Handle auf die USB-Kamera-Instanz

Param 2: Timeout Millisekunde Standard ist 1500ms Rückgabewert: Fehlercode

4.2.7.5 Empfohlenes Betriebsverfahren


Bildverarbeitung mit Raspberry Pi und Python

Der Raspberry Pi verfügt über einen dedizierten Kameraeingang, mit dem Benutzer HD-Videos und hochauflösende Fotos aufnehmen können. Mit Python und spezifischen Bibliotheken, die für den Pi geschrieben wurden, können Benutzer Tools erstellen, die Fotos und Videos aufnehmen und diese in Echtzeit analysieren oder für die spätere Verarbeitung speichern. In diesem Tutorial werde ich die 5MP Picamera v1.3 verwenden, um Fotos zu machen und sie mit Python und einem Pi Zero W zu analysieren. Dadurch entsteht ein in sich geschlossenes System, das als Werkzeug zur Identifizierung von Gegenständen, als Sicherheitssystem oder als andere Bildverarbeitung verwendet werden kann Anwendung. Das Ziel besteht darin, die Grundlagen für die Aufzeichnung von Videos und Bildern auf dem Pi zu schaffen und diese Bilder mithilfe von Python und Statistiken zu analysieren.

Teileliste und Picamera-Verkabelung

Für dieses Tutorial werden nur zwei wesentliche Teile benötigt: der Raspberry Pi und die Picamera. Es stehen zwei Picameras zur Verfügung, ich werde jedoch die ältere und billigere Version V1.3 verwenden, eine 5-MP-Kamera, die HD-Videos aufnehmen kann. Die andere Picamera sollte genauso gut funktionieren, die V2, die 8 MP bietet, aber die gleiche Videoqualität. Ich kann mir nicht vorstellen, dass es zwischen den beiden Anwendungsunterschiede gibt, daher gehe ich davon aus, dass beides ausreicht.

Raspberry Pi Zero W mit Kabeln - 22,80 $ [Amazon]

Die Verkabelung der Picamera mit dem RPi ist recht einfach - sowohl die Picamera als auch der Pi haben Bändcheneingänge, an denen das dicke Flachbandkabel angeschlossen wird. Beim RPi Zero verjüngt sich das Flachbandkabel zu einem dünneren Profil, an dem der Pi verdrahtet werden sollte. Die silbernen Bahnen sollten immer in Kontakt mit den Bahnen sein, mit denen sie verbunden sind - verwechseln Sie dies nicht, da die Bahnen auf dem Band beschädigt werden können, wenn das Band falsch in die Pi- oder Picamera-Slots eingeführt wird. Wenn die Verkabelung immer noch unklar ist, sehen Sie sich das Bild unten an. Beachten Sie, dass der schwarze Streifen nach oben zeigt, wenn Sie das Farbband an den Schlitz anschließen. Der schwarze Streifen muss sowohl für die Picamera- als auch für die Pi Zero-Steckplätze auf derselben Seite wie das weiße Gehäuse gehalten werden.

Korrekte Verkabelung von Picamera zu RPi Zero W

Testen der Picamera und der Picamera Toolbox von Python

Es gibt zahlreiche Tutorials für die ersten Schritte mit der Picamera, daher werde ich nur einige empfohlene Tutorials erwähnen und kurz erklären, wie Sie die Picamera für die Verwendung mit dem Pi und Python vorbereiten. Die besten Tutorials für die ersten Schritte sind unten aufgeführt:

Der Ausgangspunkt, um die Picamera zum Laufen zu bringen, besteht darin, sicherzustellen, dass sie in der Raspberry Pi-Konfiguration aktiviert ist. Sie können dies (am einfachsten) tun, indem Sie zu "Preferences->Raspberry Pi Configuration" gehen und die Registerkarte "Interfaces" auswählen und schließlich auf "Enable" neben der Kameraoption klicken. Klicken Sie dann auf OK. The Pi may need to restart after this process. The visual steps are shown below for reference.

Once the camera module is enabled, it’s time to verify that the version of Python being used has the picamera library installed. The easiest way to do this is to open up IDLE (I’m using Python 3.5.3), and import the picamera module as shown below:

If an error results after the import, then follow the instructions outlined in the picamera Python installation page (link here). If there was no error, we can proceed and verify that Python is communicating properly with the picamera and the camera is functioning as expected.

The code below outputs a 5 second full screen preview, takes a static image, and saves it as a .jpg file. Upon verification of the saved image, we can conclude that the picamera and Python picamera library are working together, and the image processing portion of this tutorial can begin.

For analysis reasons, objects of red, green, and blue were chosen to match the sub-pixel receptors of the camera (red, blue, green - RGB). I selected three breadboards, one of each color, as my test objects. The full-scale image (2560x1920 pixels) is shown below and was taken using the method given in the code above.

Raw Output (cropped) From The Raspberry Pi Camera

The quality of the photo is quite poor and this is due to the relatively low resolution of the camera (only 5MP) and the lack of processing routines available in most modern cameras. The poor quality is not important for our analysis, as much of what will be explored will involve general shapes and colors in images - something that doesn’t require sharpness or visually pleasure color palettes.

Using Python to Plot Raw Image Data

Numpy and matplotlib will be used to analyze and plot images taken by the picamera. To start, the simplest method for plotting the images is using matplotlib’s ‘imshow’ function, which plots all three RGB colors in a traditional format seen by the human eye. The code for showing an image using this method is shown below:

The plot should look something like the figure below, where the image’s origin is the top left corner of the plot. We will be using this as the general layout for analyzing the images taken by the picamera.

Next, we can decompose the image into its three color components: red, green, and blue. The code to do this is shown below, with an example plot showing the true color image with its three color components.

Differentiating RGB with Python

As a simple introduction into image processing, it is valid to begin by analyzing color content in an image. This can be done using a multitude of statistical tools, the easiest being normally distributed mean and standard deviation. With the image above, we can take each RGB component and calculate the average and standard deviation to arrive at a characterization of color content in the photo. This will allow us to determine what colors are contained in the image and to what frequency they occur. Since we have three identical red, blue, and green objects - we would expect each object to produce a unique color signature when introduced into the frame of the camera.

First, we need consistency from the picamera, which means we need to ensure that the picamera is not changing its shutter speed or white balance. I have done this in the code below. Next, we need to establish the background information contained in the frame of the image. I do this by taking an image of the white background (no colors) and using the data as the background ‘noise’ in the image frame. This will help us identify unique changes in color introduced into the frames by the RGB breadboards. The code for all of this, plus the mean and standard deviation of the frame is given below. Using the code below, we can identify whether a red, blue, or green breadboard has been introduced into the frame.

The code should print out the mean and standard deviation of each color component, and also predict the color of the object inserted into the frame. A sample printout is shown below:

The user may notice that complications arise when multiple colors are present in the image. This is because the background information has drastically changed with the introduction of multiple colors. This results in uneven statistical relevance in the reading of each color when compared to the background noise. Therefore, for multiple object color recognition, more complex spatial tools are needed to identify regions of colors. This is a complication that will be reserved for the next entry into the image processing series.

A video demonstration of this is given below:

Conclusion and Continuation

In the first entry into the Image Processing Using Raspberry Pi and Python, the picamera and its Python library were introduced as basic tools for real-time analysis. Additionally, simple tools for plotting an image and its components were explored, along with more complex tools involving statistical distributions of colors. The combination of picamera and Python is a powerful tool with applications where differentiating colors may be of importance. One application comes to mind involving industrial quality control, where color consistency may be of utmost importance. Moreover, the ability to analyze images in real-time is a tool that exists in many technologies ranging from smartphone facial recognition, to security systems, and even autonomous vehicle navigation. For the next entry in the Image Processing tutorial series, spatial identification tools will be explored with applications in object detection and color classification.


Python interface for DMK 23U274 USB camera for astrophotography - Astronomy

Employ both supervised and unsupervised machine learning, to make predictions or to understand data.

Learn how to use Python with Pandas, Matplotlib, and other modules to gather insights from and about your data.

Learn the basics and concepts of working with quantum computers and qubits through practical applications and the Qiskit package.

Create your own games with Python's PyGame library, or check out the multi-platform Kivy.

Learn the basic and intermediate Python fundamentals.

Not a problem, learn the basics of programming with Python 3 here!

How to develop websites with either the Flask or Django frameworks for Python.

Creating various software bots, like bots in games, in chats, and to interact with the web. Not to be confused with robotics!

Control hardware with Python programming and the Raspberry Pi.

Create software with a user interface using Tkinter, PyQt, or Kivy.

Go is a programming language aimed at being simple, easy to work with, and capable of high performance.