Thema erledigt.
Es kann doch so einfach sein
Ich musste einfach nur, sobald die Camera auf den Nachtmodus geht den camera.color_effects auf (128,128) ändern
Thema erledigt.
Es kann doch so einfach sein
Ich musste einfach nur, sobald die Camera auf den Nachtmodus geht den camera.color_effects auf (128,128) ändern
Die Bilder werden an eine Webseite (Deshalb Stream) gesendet
Hallo,
Ich hänge gerade an einem vielleicht "kleinen" Problem?
Wie kann ich die Bilder welche hier gestreamt bzw. erzeugt werden diese als Grayscale Convertieren?
Die Sache ist die das die Bilder bei Dunkelheit einen Rotstich wegen dem IR-Filter haben daher hatte ich die Idee diese evtl. als Grayscale zu Convertieren um den Rotstich weg zu bekommen.
with output.condition:
output.condition.wait()
frame = output.frame
# now add timestamp to jpeg
# Convert to PIL Image
cv2.CV_LOAD_IMAGE_COLOR = 1 # set flag to 1 to give colour image
npframe = np.frombuffer(frame, dtype=np.uint8)
pil_frame = cv2.imdecode(npframe, cv2.CV_LOAD_IMAGE_COLOR)
#pil_frame = cv2.imdecode(frame,-1)
cv2_im_rgb = cv2.cvtColor(pil_frame, cv2.COLOR_BGR2RGB)
#cv2_im_rgb = cv2.cvtColor(pil_frame, cv2.COLOR_RGB2RGBA)
pil_im = Image.fromarray(cv2_im_rgb)
#draw = ImageDraw.Draw(pil_im)
draw = ImageDraw.Draw(pil_im, 'RGBA')
Display More
Ich habe schon versucht aus cv2.COLOR_BGR2RGB -> cv2.COLOR_BGR2GRAY zu machen und auch weiter unten beim ImageDraw.Draw habe ich schon mit 'L' und 'LA' experimentiert aber ohne Erfolg.
Ich habe mir jetzt dieses Modul hier geholt. Damit kann ich mit GPIO.INPUT den Status Abfragen und dementsprechend die IR LEDs Steuern.
Ist wohl so die beste Lösung.
Die IR LEDs sind wie auf dem Plan hier angeschlossen. Das funktioniert soweit schon mal. Ist nur Blöd das man ein "Hilfsmittel" (Handykamera) benötigt beim testen um zu sehen ob diese Leuchten oder nicht
Der NPN Transistor ist ein BC547.
Im Finally-Abschnitt wird mir aber nicht mal das print angezeigt.
Ich habe jetzt das ganze Lüfterscript ausgelagert in den Autostart. Funktioniert soweit super bis auf das der Lüfter eben dennoch startet sobald ich den Pi herunterfahre. Werde später mal die Pins messen. Danke dir.
Der Code ist Großteils nicht von mir.
Ich habe diesen nur innerhalb des ersten try abgeändert damit ich die für mich passende Übertragungsausgabe habe.
Flask werd eich mir mal anschauen.
Also du meinst es ist besser die Lüftersteuerung als separates Script zu nutzen welches beim Start vom System gestartet wird?
Der Code ist ziemlich unübersichtlich, aber wenn ich das richtig verstehe, steuert das Script den Lüfter. Wenn ja, ist es klar, dass die Lüftersteuerung nicht geht, wenn das Script nicht läuft.
Aber bei dem except KeyboardInterrupt: sag ich doch das der Pin auf LOW gesetzt wird. Wieso geht der da aber bei dem Cleanup auf High wenn er Standard doch eh auf Low steht? Schließlich bekomme ich das print ja auch ausgegeben und die LEDs gehen auch aus.
Hallo,
Ich hab diesen [Anzeige] 30mm Lüfter an meinem Raspberry angeschlossen und steuere diesen je nach CPU Temperatur.
Angeschlossen ist dieser wie wie auf den Bilder zu erkennen an 5V, GND und GPIO 14 (UART0_TXD). Auch an GPIO 4, 17 und 18 habe ich es schon versucht.
Sobald ich mein Script via strg+c beende Springt der Lüfter sofort wieder an wenn dieser an war oder bleibt eben an.
Ich habe herausgefunden das es an GPIO.Cleanup() liegt. Sobald ich das Cleanup raus nehme geht der Lüfter auch aus aber dann geht er im Umkehrschluss nicht Automatisch an je nach CPU Temperatur.
Hier das Python Script:
import os
import io
import cv2
import traceback
import picamera
import logging
import socketserver
import RPi.GPIO as GPIO #GPIO.BCM
import numpy as np
import datetime as dt
from io import StringIO
from threading import Condition
from PIL import ImageFont, ImageDraw, Image
from http.server import BaseHTTPRequestHandler,HTTPServer
port = 8000
resW = '1024'
resH = '576'
fps = 6
GPIO.setmode(GPIO.BCM)
gpioPinFAN = 14 #Fan
GPIO.setup(gpioPinFAN, GPIO.OUT)
#pwm = GPIO.PWM(gpioPinFAN, 100)
#pwm.start(0) # Prozent von 0.0 - 100.0
gpioPinIR = 24 #IR LEDs
GPIO.setup(gpioPinIR, GPIO.OUT)
GPIO.output(gpioPinIR, GPIO.HIGH) #Turn LEDs on, on program start
PAGE="""\
<img src="stream.mjpg" width="{resW}" height="{resH}" />
"""
class StreamingOutput(object):
def __init__(self):
self.frame = None
self.buffer = io.BytesIO()
self.condition = Condition()
def write(self, buf):
if buf.startswith(b'\xff\xd8'):
# New frame, copy the existing buffer's content and notify all
# clients it's available
self.buffer.truncate()
with self.condition:
self.frame = self.buffer.getvalue()
self.condition.notify_all()
self.buffer.seek(0)
return self.buffer.write(buf)
class StreamingHandler(BaseHTTPRequestHandler):
def do_GET(self):
global visitors
global gpioPinFAN
global gpioPinIR
if self.path == '/':
self.send_response(301)
self.send_header('Location', '/index.html')
self.end_headers()
elif self.path == '/index.html':
content = PAGE.encode('utf-8')
self.send_response(200)
self.send_header('Content-Type', 'text/html')
self.send_header('Content-Length', len(content))
self.end_headers()
self.wfile.write(content)
elif self.path == '/stream.mjpg':
self.send_response(200)
self.send_header('Age', 0)
self.send_header('Cache-Control', 'no-cache, private')
self.send_header('Pragma', 'no-cache')
self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=FRAME')
self.end_headers()
try:
while True:
def getCPUtemperature():
res = os.popen('vcgencmd measure_temp').readline()
return(res.replace("temp=","").replace("'C\n",""))
with output.condition:
output.condition.wait()
frame = output.frame
# now add timestamp to jpeg
# Convert to PIL Image
cv2.CV_LOAD_IMAGE_COLOR = 1 # set flag to 1 to give colour image
npframe = np.frombuffer(frame, dtype=np.uint8)
pil_frame = cv2.imdecode(npframe,cv2.CV_LOAD_IMAGE_COLOR)
#pil_frame = cv2.imdecode(frame,-1)
cv2_im_rgb = cv2.cvtColor(pil_frame, cv2.COLOR_BGR2RGB)
#cv2_im_rgb = cv2.cvtColor(pil_frame, cv2.COLOR_RGB2RGBA)
pil_im = Image.fromarray(cv2_im_rgb)
#draw = ImageDraw.Draw(pil_im)
draw = ImageDraw.Draw(pil_im, 'RGBA')
bg_w, bg_h = pil_im.size
# Setup Overlay
txt_font = ImageFont.truetype("/usr/share/fonts/truetype/freefont/FreeSans.ttf", 14)
txt_color = "white"
txt_topLeft = "PiCam LIVE"
#txt_topLeft = "PiCam LIVE (" + str(visitors) + " Zuschauer)"
txt_topRight = dt.datetime.now().strftime('%d.%m.%Y | %H:%M:%S')
#txt_topRight = dt.datetime.now().strftime('%d.%m.%Y | %H:%M:%S') + " - " + str(round(float(getCPUtemperature()))) + "°C"
# Get text size (width, height)
txt_topLeft_size = txt_font.getsize(txt_topLeft)
txt_topRight_size = txt_font.getsize(txt_topRight)
# Draw text and background top left
draw.rectangle((0, 0, txt_topLeft_size[0]+20, txt_topLeft_size[1]+10), fill=(0, 0, 0, 192)) #Rectangle top left
draw.text((10, 5), txt_topLeft, font=txt_font, fill=txt_color) #Text top left
# Draw text and background top right
draw.rectangle((bg_w, 0, bg_w-txt_topRight_size[0]-20, txt_topRight_size[1]+10), fill=(0, 0, 0, 192)) #Rectangle top right
draw.text((bg_w-txt_topRight_size[0]-10, 5), txt_topRight, font=txt_font, fill=txt_color) #Text top right
if (getCPUtemperature() >= str(41)):
GPIO.output(gpioPinFAN, GPIO.HIGH)
#pwm.ChangeDutyCycle(100)
else:
GPIO.output(gpioPinFAN, GPIO.LOW)
#pwm.ChangeDutyCycle(0)
#elif (getCPUtemperature() < str(40)):
# #GPIO.output(gpioPinFAN, GPIO.LOW)
# pwm.ChangeDutyCycle(0)
# Save the image
buf = io.BytesIO()
#pil_im = pil_im.convert('RGB')
pil_im.save(buf, format= 'JPEG')
frame = buf.getvalue()
self.wfile.write(b'--FRAME\r\n')
self.send_header('Content-Type', 'image/jpeg')
self.send_header('Content-Length', len(frame))
self.end_headers()
self.wfile.write(frame)
self.wfile.write(b'\r\n')
except Exception as e:
traceback.print_exc()
logging.warning(
'Removed streaming client %s: %s',
self.client_address, str(e))
else:
self.send_error(404)
self.end_headers()
class StreamingServer(socketserver.ThreadingMixIn, HTTPServer):
allow_reuse_address = True
daemon_threads = True
with picamera.PiCamera(resolution=resW+"x"+resH, framerate=fps) as camera:
output = StreamingOutput()
#camera.rotation = 180
camera.start_recording(output, format='mjpeg')
#camera.annotate_foreground = picamera.Color(y=0.2,u=0, v=0)
#camera.annotate_background = picamera.Color(y=0.8, u=0, v=0)
try:
print("[Streaming started] " + dt.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + " - " + resW+"x"+resH + " @ " + str(fps) + " FPS") #http://<xxx.xxx.x.xxx:xxxx>/stream.mjpg
address = ('', port)
server = StreamingServer(address, StreamingHandler)
server.serve_forever()
except KeyboardInterrupt:
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)
GPIO.output(14, GPIO.LOW) #Turn Fan off, on program exit
GPIO.setup(24, GPIO.OUT)
GPIO.output(24, GPIO.LOW) #Turn LEDs off, on program exit
GPIO.cleanup()
#pwm.stop()
print("[Streaming stopped] " + dt.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
finally:
camera.stop_recording()
Display More
Auch via PWM Control geht der Lüfter einfach nicht aus bzw. wieder an.
Die LEDs jedoch gehen aus bzw. werden auf LOW gesetzt.
Ich weiß echt nicht mehr weiter...
Ok danke.
Das mit dem Modul ist mir gerade etwas zu Kompliziert. Sorry für die Dummheit meinerseits die evtl. so rüber kommt.
Ist diese Schaltung mit einem NPN Transistor denn korrekt bzw. habe ich das so richtig verstanden?
Edit: Ich habe gestern vergessen den Vorwiederstand mit in die Zeichnung zu nehmen, sollte diese soweit korrekt sein. Benötige ich da jetzt einen 36 Ohm oder einen 18 Ohm Wiederstand?
Gerechnet habe ich: 3,3V - 1,5V / 50 mA = 36 Ohm und ein mal 3,3V - 1,5V / 100 mA = 18 Ohm
Ich weiß nur nicht was ich nehmen soll da eine IR LED 50 mA (Peak 100 mA) hat.
würde ich ein Modul mit einem ULN2803A (in SMD Bauform hat es ca. Daumengröße) verwenden.
Kannst du mir da eins empfehlen? Ich finde dazu nichts. Vermutlich bin ich einfach zu blöd dafür
Es gibt auch fertige Module zu kaufen. Man muss "nur" darauf achten, das diese sich mit 3,3V sicher ansteuern lassen.
So ein Modul ist gut und schön. Aber dafür ist an der Front, wo auch die Kamera sitzt, leider nicht genügend Platz. Deshalb benötige ich eine "Custom" Lösung.
Das ist die IR-LED. 1,5V aber 50mA. Was brauche ich bzw. wie schalte ich 2 dieser LEDs zusammen an einen GPIO? 2 dieser LEDs benötigen dann 3V was an einem GPIO ja machbar ist aber mit den Milliampere geht das ja nicht
Aktuell bin ich nicht zu Hause. Werde ich heute Abend mal testen. Danke für den Tipp.
Das eigentliche Problem sind jedoch die IR LEDs.
Hallo,
Da ich ein absoluter Elektronik Anfänger bin frage ich euch einfach mal ob Ihr mir da helfen könnt.
Ich habe diese IR-Cut Kamera [Anzeige] und Möchte zu dieser gern selbst 1 bis 2 IR LEDs per GPIO Steuern da die IR-LEDs welche zu solchen Kameras dazu sind zu groß für mein Projekt sind.
Da man von dieser Kamera die Helligkeit der Fotodiode leider nicht auslesen kann habe ich mal etwas geschaut und bin über dieses Modul gestoßen. Das Modul gibt True und False zurück was für eine Schaltung der LEDs per Python ja genügen sollte. Nun ist meine Frage aber wie ich 1 oder 2 IR-LEDs so Verkabel das ich diese per Script an- und ausschalten kann je nachdem ob das Modul True oder False zurück gibt?
Die IR-LEDs laufen, soweit ich gelesen habe, alle mit 5V aber den 5V am Pi kann man ja nicht steuern.
Viel platz für massig Kabel gibt es auch nicht da sonst der Luftstrom für die Kühlung gestört werden würde.
Ich hoffe Ihr könnt mir da weiterhelfen.
Schöne Osterfeiertage
Ich muss dieses Thema noch mal hoch holen.
Franky07 hatte mir Anfangs geholfen worüber ich sehr Dankbar bin. Schlussendlich habe ich ihm die extra angefertigten Platinen inkl. den kleinen Bauteilen zugeschickt. Er wollte dies dann für mich fertig machen da ich Löttechnisch nicht so begabt bin was solche extrem kleinen teile angeht. Leider habe ich dann seit August letzten Jahres nichts mehr von ihm gehört.
Daher hoffe ich auf noch jemand anderen der mir evtl. bei diesem Projekt helfen kann oder evtl. noch eine andere Lösung hat?
Im Grunde bin auf auf der Suche nach so etwas (siehe Link) bzw. wollte ich mir in passender Größe selbst machen. Aber alles was ich von solchen Runden IR LED Platinen finde sind entweder zu groß oder müssen mit 12V betrieben werden.
https://www.ebay.de/itm/124219500048?_trksid=p4375194.c101952.m162921
Hat denn niemand eine Idee?
Das Script für den Stream ist nicht von mir selbst. So gut bin ich dann auch wieder nicht
Das GUI läuft Problemlos ohne Freeze o.ä. wenn das Script läuft. Nur das Beenden macht mir Probleme.
Hallo,
Ich habe mir für meine Live-Camera ein kleines TkInter GUI gebaut. Über dieses GUI möchte ich via Button den Stream Starten und auch Beenden können.
Kann mir evtl. jemand sagen wie ich das bei diesem Script umsetzen kann?
Egal was ich tue oder wie ich camera.stop_recording() Aufrufe der Stream läuft weiter und die App/GUI hängt sich auf.
Es geht um folgenden Streaming Code:
class StreamingOutput(object):
def __init__(self):
self.frame = None
self.buffer = io.BytesIO()
self.condition = Condition()
def write(self, buf):
if buf.startswith(b'\xff\xd8'):
# New frame, copy the existing buffer's content and notify all
# clients it's available
self.buffer.truncate()
with self.condition:
self.frame = self.buffer.getvalue()
self.condition.notify_all()
self.buffer.seek(0)
return self.buffer.write(buf)
class StreamingHandler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
self.send_response(301)
self.send_header('Location', '/index.html')
self.end_headers()
elif self.path == '/index.html':
content = PAGE.encode('utf-8')
self.send_response(200)
self.send_header('Content-Type', 'text/html')
self.send_header('Content-Length', len(content))
self.end_headers()
self.wfile.write(content)
elif self.path == '/stream.mjpg':
self.send_response(200)
self.send_header('Age', 0)
self.send_header('Cache-Control', 'no-cache, private')
self.send_header('Pragma', 'no-cache')
self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=FRAME')
self.end_headers()
try:
while True:
def getCPUtemperature():
res = os.popen('vcgencmd measure_temp').readline()
return(res.replace("temp=","").replace("'C\n",""))
with output.condition:
output.condition.wait()
frame = output.frame
# now add timestamp to jpeg
# Convert to PIL Image
cv2.CV_LOAD_IMAGE_COLOR = 1 # set flag to 1 to give colour image
npframe = np.frombuffer(frame, dtype=np.uint8)
pil_frame = cv2.imdecode(npframe,cv2.CV_LOAD_IMAGE_COLOR)
#pil_frame = cv2.imdecode(frame,-1)
cv2_im_rgb = cv2.cvtColor(pil_frame, cv2.COLOR_BGR2RGB)
#cv2_im_rgb = cv2.cvtColor(pil_frame, cv2.COLOR_RGB2RGBA)
pil_im = Image.fromarray(cv2_im_rgb)
#draw = ImageDraw.Draw(pil_im)
draw = ImageDraw.Draw(pil_im, 'RGBA')
bg_w, bg_h = pil_im.size
# Setup Overlay
txt_font = ImageFont.truetype("/usr/share/fonts/truetype/freefont/FreeSans.ttf", 14)
txt_color = "white"
txt_topLeft = "PiCam LIVE"
txt_topRight = dt.datetime.now().strftime('%d.%m.%Y | %H:%M:%S')
#txt_topRight = dt.datetime.now().strftime('%d.%m.%Y | %H:%M:%S') + " - " + str(round(float(getCPUtemperature()))) + "°C"
# Get text size (width, height)
txt_topLeft_size = txt_font.getsize(txt_topLeft)
txt_topRight_size = txt_font.getsize(txt_topRight)
# Draw text and background top left
draw.rectangle((0, 0, txt_topLeft_size[0]+20, txt_topLeft_size[1]+10), fill=(0, 0, 0, 192)) #Rectangle top left
draw.text((10, 5), txt_topLeft, font=txt_font, fill=txt_color) #Text top left
# Draw text and background top right
draw.rectangle((bg_w, 0, bg_w-txt_topRight_size[0]-20, txt_topRight_size[1]+10), fill=(0, 0, 0, 192)) #Rectangle top right
draw.text((bg_w-txt_topRight_size[0]-10, 5), txt_topRight, font=txt_font, fill=txt_color) #Text top right
# SkyWeather logo in lower right
#size = 64
#SWLimg = Image.open("/home/myApps/SkyWeatherLogoSymbol.png")
#SWLimg.thumbnail((size,size),Image.ANTIALIAS)
#pil_im.paste(SWLimg, (bg_w-size, bg_h-size))
# Save the image
buf = io.BytesIO()
#pil_im = pil_im.convert('RGB')
pil_im.save(buf, format= 'JPEG')
frame = buf.getvalue()
self.wfile.write(b'--FRAME\r\n')
self.send_header('Content-Type', 'image/jpeg')
self.send_header('Content-Length', len(frame))
self.end_headers()
self.wfile.write(frame)
self.wfile.write(b'\r\n')
except Exception as e:
traceback.print_exc()
logging.warning(
'Removed streaming client %s: %s',
self.client_address, str(e))
else:
self.send_error(404)
self.end_headers()
class StreamingServer(socketserver.ThreadingMixIn, HTTPServer):
allow_reuse_address = True
daemon_threads = True
with picamera.PiCamera(resolution=resW+"x"+resH, framerate=fps) as camera:
output = StreamingOutput()
#camera.rotation = 180
camera.start_recording(output, format='mjpeg')
#camera.annotate_foreground = picamera.Color(y=0.2,u=0, v=0)
#camera.annotate_background = picamera.Color(y=0.8, u=0, v=0)
try:
logfile(1, 0, 1, timestamp + "Streaming started with " + resW+"x"+resH + " @ " + str(fps) + " FPS")
console.insert(END, timestamp + "[STEAMING] Started with " + resW+"x"+resH + " @ " + str(fps) + " FPS")
address = ('', port)
server = StreamingServer(address, StreamingHandler)
server.serve_forever()
finally:
#GPIO.output(gpioPin, GPIO.LOW)
#GPIO.cleanup()
logfile(1, 0, 1, timestamp + "Streaming stopped")
console.insert(END, timestamp + "[STEAMING] Stopped")
camera.stop_recording()
Display More
Das Script bzw. den Stream kann ich nur Beenden wenn ich ihn mit strg+c "kille" was aber mit einer GUI nicht so optimal ist.
Vielen dank für deine Erklärung.
Ich komm mir jetzt etwas blöd vor aber mit solchen Schaltungen/Skizzen wie du sie geposted hast kann ich leider nichts Anfangen Sprich ich kann da nichts rauslesen.
Habe auch schon mehrere Tutorials gefunden aber keines was den Aufbau erklärt wenn der Fototransistor einzeln ist.
Ok. Nach weiterer Recherche habe ich gelesen das man so einen 5mm Fototransistor zwar über einen 1k Ohm Wiederstand an die GPIOs klemmen kann aber dann nur den Status "Ein" und "Aus" hat. Also keine direkten Werte der Helligkeit. Ich kann aber nirgends rausfinden was für eine Platine/Modul ich direkt dafür benötige.
So lange die Platine extra ist kann ich die noch irgendwo ins Gehäuse packen.
Lichtsensoren/Fototransistoren
Haben die eine genaue Bezeichnung? Alles was ich finde sind kleinere Platinen die aber wieder zu groß sind um diese an der Front irgendwie mit zu Platzieren.
Dann könnte ich ja theoretisch ein so einen Lichtsensoren/Fototransistoren separat für die LEDs verbauen.
Naja was heißt Grundkenntnisse. Das einfachste vom einfachsten verstehe ich
Mein Aktuellen Gehäuse welches ich mir selbst gedruckt habe ist das Maximalste was ich in meinem Ultimaker 2GO Drucken kann. Das ist mir aber zu "Klobig" das Gehäuse (Bild 1) deshalb wollte ich mir ein kleineres machen was mehr nach einer "Überwachungskamera" Aussieht (Bild 2). Aber dafür stören die beiden IR LEDs da die Kamera damit zu breit wird.
Ich dachte eben das man die Lichthelligkeit oder eben den Status/Modus des IR-Sensors irgendwie auslesen kann was ja aber wie du sagtest leider nicht geht.