Seite 1 von 1

Hilfe TXT4: Kamera-Bild auf Display

Verfasst: 08 Mär 2026, 10:52
von uffi
Hallo Community,

ich benötige Eure Hilfe. Habe gerade den TXT4.0 in Betrieb genommen und versuche mit einem ersten Programm nach der Hilfefunktion ein Kamerabild auf das Display zu bekommen.
TXT4Cam2Display.PNG
TXT4Cam2Display.PNG (107.84 KiB) 193 mal betrachtet
Dabei gibt es folgende Fehlermeldung:

Code: Alles auswählen

Programm startet...

Exception in thread Thread-4:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.5/threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.5/site-packages/fischertechnik/controller/txt4/Txt4Camera.py", line 141, in __update
    value=image
  File "/opt/ft/workspaces/KameraDisplay/KameraDisplay.py", line 15, in image_callback
    base64 = frame_to_base64(event.value)
  File "/opt/ft/workspaces/KameraDisplay/KameraDisplay.py", line 26, in frame_to_base64
    result = "data:image/jpeg;base64," + base64.b64encode(image).decode("utf-8")
AttributeError: 'NoneType' object has no attribute 'b64encode'
Anscheinend ist kein Bild da. Der Kameraprozeß wurde aber gestartet mit:

Code: Alles auswählen

# auto generated content from camera configuration
from lib.controller import *
import fischertechnik.factories as txt_factory

TXT_M_USB1_1_camera.set_rotate(False)
TXT_M_USB1_1_camera.set_height(120)
TXT_M_USB1_1_camera.set_width(160)
TXT_M_USB1_1_camera.set_fps(15)
TXT_M_USB1_1_camera.start()
Wo liegt mein Fehler?

Danke, Dirk

Re: Hilfe TXT4: Kamera-Bild auf Display

Verfasst: 08 Mär 2026, 11:26
von calliope
Ich würde in der base64 Zeile die Variable bild und nicht Ereignis einsetzen.

Re: Hilfe TXT4: Kamera-Bild auf Display

Verfasst: 08 Mär 2026, 12:21
von uffi
Danke für den Tipp, leider blieb die Fehlermeldung die gleiche. Habe aber nun den Code direkt als python code so eingegeben und komme ein Stück weiter:

Code: Alles auswählen

import base64
import cv2
import fischertechnik.factories as txt_factory
import time
from lib.camera import *
from lib.controller import *

#your python code
TXT_M_USB1_1_camera.set_rotate(False)
TXT_M_USB1_1_camera.set_height(240)
TXT_M_USB1_1_camera.set_width(320)
TXT_M_USB1_1_camera.set_fps(15)
TXT_M_USB1_1_camera.start()

def frame_to_base64(frame):
  result = ""
  success, image = cv2.imencode(".jpeg", frame, [1, 30])
  if success:
    result = "data:image/jpeg;base64," + base64.b64encode(image).decode("utf-8")
  return result

time.sleep(3)
while True:
  #your python code
  while True:
    bild = TXT_M_USB1_1_camera.read_frame()
    if bild is not None:
      base64 = frame_to_base64(bild)
      if base64 is not None:
        display.set_base64_image("txt_image", base64)
        break
Nun gibt es etwas später eine Fehlermeldung bei dem Versuch das Bild zu reskalieren (für das Display?):

Code: Alles auswählen

Programm startet...

VIDIOC_DQBUF: Invalid argument
Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.5/threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.5/site-packages/fischertechnik/camera/VideoStream.py", line 118, in __update
    frame = imutils.resize(frame, width=self.__width, height=self.__height)
  File "/usr/lib/python3.5/site-packages/imutils/convenience.py", line 69, in resize
    (h, w) = image.shape[:2]
AttributeError: 'NoneType' object has no attribute 'shape'
Hat dazu jemand eine Idee?

Danke, Dirk

Re: Hilfe TXT4: Kamera-Bild auf Display

Verfasst: 08 Mär 2026, 14:23
von uffi
Hab nun eine funktionierende Lösung, der Fehler in meinem ersten Ansatz ganz oben war, dass der Name des base64 Bildes mit dem Namen in dem camera change listener ("image") übereinstimmen muss.
TXT4Cam2Display2.PNG
TXT4Cam2Display2.PNG (27.98 KiB) 124 mal betrachtet

Code: Alles auswählen

import base64
import cv2
import time
from lib.camera import *
from lib.controller import *
from lib.display import *

image = None


def image_callback(event):
  global image
  image = frame_to_base64(event.value)
  display.set_base64_image("txt_image", image)


TXT_M_USB1_1_camera.add_change_listener("image", image_callback)


def frame_to_base64(frame):
  result = ""
  success, image = cv2.imencode(".jpeg", frame, [1, 30])
  if success:
    result = "data:image/jpeg;base64," + base64.b64encode(image).decode("utf-8")
  return result


while True:
  pass
Damit wird das Kamera Bild tatsächlich auf dem Display angezeigt.

Gruß, Dirk