TXT Kamera mit OpenCV (Python)

Hallo Kids, hier ist eine Ecke extra für euch!
Ihr könnt hier Fragen aller Art stellen, die wir euch gerne so schnell wie möglich beantworten.
Ihr dürft hier aber auch gerne eure Modelle einfach mal anderen Fischertechnikern vorstellen.
jonathan
Beiträge: 11
Registriert: 10 Sep 2022, 11:26

TXT Kamera mit OpenCV (Python)

Beitrag von jonathan » 12 Sep 2022, 16:58

Hallo,

ich möchte gerne mit OpenCV (Python) Bilder der USB-Kamera am TXT verarbeiten können.

Beispielcode:
#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import ftrobopy
import time
import cv2
import numpy as np

txt = ftrobopy.ftrobopy('192.168.178.44', 65000)

txt.startCameraOnline()
time.sleep(2.5)

frame = txt.getCameraFrame()

bild = np.array(frame)

grau = cv2.cvtColor(bild, cv2.COLOR_RGB2GRAY)


Ich bekomme folgenden Fehler:

cv2.error: OpenCV(4.2.0) ../modules/imgproc/src/color.simd_helpers.hpp:92: error: (-2:Unspecified error) in function 'cv::impl::{anonymous}::CvtHelper<VScn, VDcn, VDepth, sizePolicy>::CvtHelper(cv::InputArray, cv::OutputArray, int) [with VScn = cv::impl::{anonymous}::Set<3, 4>; VDcn = cv::impl::{anonymous}::Set<1>; VDepth = cv::impl::{anonymous}::Set<0, 2, 5>; cv::impl::{anonymous}::SizePolicy sizePolicy = cv::impl::<unnamed>::NONE; cv::InputArray = const cv::_InputArray&; cv::OutputArray = const cv::_OutputArray&]'
> Invalid number of channels in input image:
> 'VScn::contains(scn)'
> where
> 'scn' is 1

Was muss ich tun, damit das (auch nur auf dem TXT) funktioniert?

Viele Grüße
Jonathan

Benutzeravatar
elektrofuzzis
Beiträge: 212
Registriert: 25 Jun 2016, 09:40

Re: TXT Kamera mit OpenCV (Python)

Beitrag von elektrofuzzis » 12 Sep 2022, 20:18

Hallo Jonathan,

Laut Dokumentation von ftRoboPy (https://github.com/ftrobopy/ftrobopy/bl ... manual.pdf) gibt die getCameraFrame-Methode ein Bild im jpeg-Format zurück. Du versuchst dieses hier mit np.array() als rohe Pixeldaten zu nutzen.
Du hast nun zwei Möglichkeiten:

1. Speichere die Datei als .jpg-Datei und lade sie mit cv2.imread():

Code: Alles auswählen

with open("datei.jpg", "wb") as datei:
    datei.write(frame)

bild = cv2.imread("datei.jpg")
2. Lade das Bild mit der Pillow-Bibliothek
Dazu musst du zuerst Pillow via pip installieren

Code: Alles auswählen

pip install Pillow
Danach kannst du so dein Bild laden:

Code: Alles auswählen

from io import BytesIO
from PIL import Image

frame_jpgdaten = BytesIO(frame)
geladenes_bild = Image.open(frame_jpgdaten)
bild = np.asarray(geladenes_bild)

Notiz:
1) Ich habe den zweiten Weg nicht ausprobiert, sollte aber funktionieren.
2) Die io-Bibliothek ist Teil der Standartbibliothek von Python, muss also nicht seperat installiert werden


Gruss

Christian

jonathan
Beiträge: 11
Registriert: 10 Sep 2022, 11:26

Re: TXT Kamera mit OpenCV (Python)

Beitrag von jonathan » 13 Sep 2022, 15:00

Vielen Dank für die Antwort.
Jedoch erhalte ich bei beiden Möglichkeiten den Fehler:
TypeError: a Bytes-like object is required, not ‘list‘


Gruß
Jonathan

Benutzeravatar
elektrofuzzis
Beiträge: 212
Registriert: 25 Jun 2016, 09:40

Re: TXT Kamera mit OpenCV (Python)

Beitrag von elektrofuzzis » 13 Sep 2022, 18:35

Hallo,

Ich sehe was du meinst.

Füge mal diese Zeile vor den Versuchen ein:

Code: Alles auswählen

frame = bytearray(frame)
Übrigens ist der zweite Weg der potentiell schnellere.

Gruß

Christian

jonathan
Beiträge: 11
Registriert: 10 Sep 2022, 11:26

Re: TXT Kamera mit OpenCV (Python)

Beitrag von jonathan » 16 Sep 2022, 16:43

Ok, Danke.

Es funktioniert jetzt. Aber leider nur im online Modus.
In der ftrobopy Datei steht folgendes:

Falls diese Funktion im Offline-Modus auf dem TXT unter der CFW verwendet werden soll, muss zuvor die ftGUI-App auf dem TXT gestartet werden. Im ‘direct‘ -Modus stehen die Camera-Funktionen von ftrobopy nicht zur Verfügung. In diesem Fall sollte die openCV-Bibilothek oder ftrobopylib.so verwendet werden.

Mit cv2.VideoCapture(0) hab och es schon probiert das scheint aber nicht zu funktionieren.

Und die ftGUI App kann man nach dem Start des Programms auch nicht mehr öffnen. Und in der ftGUI App hat man keinen Zugriff auf die in die CFW hochgeladenen Programme.

Wie kann ich das Programm auf dem TXT offline laufen lassen?

Grüße
Jonathan

Torsten
Beiträge: 308
Registriert: 29 Jun 2015, 23:08
Wohnort: Gernsheim (Rhein-Main-Region)

Re: TXT Kamera mit OpenCV (Python)

Beitrag von Torsten » 18 Sep 2022, 11:25

Eigentlich sollte das mit cv2 funktionieren:

Code: Alles auswählen

cam = cv2.VideoCapture(0)
time.sleep(2)
res, pic = cam.read()
(cv2.VideoCapture kann nicht gleichzeitig mit der ftGUI verwendet werden)

Welche Version der CFW verwendest du ?
Falls der Camera-Port des TXT gar nicht mehr reagiert, könnte auch ein Reboot des TXT helfen.

jonathan
Beiträge: 11
Registriert: 10 Sep 2022, 11:26

Re: TXT Kamera mit OpenCV (Python)

Beitrag von jonathan » 26 Sep 2022, 17:12

Wenn ich diesen Code ausführe wird auf dem TXT None angezeigt:

Code: Alles auswählen

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from TouchStyle import *
import ftrobopy
import cv2
import time

class FtcGuiApplication(TouchApplication):
	def __init__(self, args):
		TouchApplication.__init__(self, args)
		# Creates an empty MainWindow
		w = TouchWindow("Test")
		txt = ftrobopy.ftrobopy('localhost', 65000)
		video = cv2.VideoCapture(0)
		time.sleep(2)		
		res, frame = video.read()

		text = 'OK'  
		if frame == None:
			text = 'None'
		err_msg = QLabel(text)
		err_msg.setWordWrap(True)
		err_msg.setAlignment(Qt.AlignCenter)
		w.setCentralWidget(err_msg)

        
		w.show()
		self.exec_()        

if __name__ == "__main__":
	FtcGuiApplication(sys.argv)
Das müsste doch heißen, dass kein Bild zurückgegeben wird, oder?

Ich verwende die aktuellste Version 0.9.6.

jonathan
Beiträge: 11
Registriert: 10 Sep 2022, 11:26

Re: TXT Kamera mit OpenCV (Python)

Beitrag von jonathan » 26 Sep 2022, 17:15

Wenn ich das Programm über ssh (ftGUI nicht geöffnet) auf dem TXT ausführe wird 'select timeout' angezeigt.

jonathan
Beiträge: 11
Registriert: 10 Sep 2022, 11:26

Re: TXT Kamera mit OpenCV (Python)

Beitrag von jonathan » 29 Sep 2022, 20:22

Hab’s jetzt gelöst und ich erhalte ein Bild :D
Das Problem war die zu hohe Auflösung die den Timeout ausgelöst hat

Benutzeravatar
uffi
Beiträge: 404
Registriert: 24 Jan 2014, 16:21
Wohnort: München

Re: TXT Kamera mit OpenCV (Python)

Beitrag von uffi » 29 Mär 2023, 17:41

und wie hast Du auf die niedrigere Auflösung der Kamera umgeschaltet? Danke und Gruß, uffi

jonathan
Beiträge: 11
Registriert: 10 Sep 2022, 11:26

Re: TXT Kamera mit OpenCV (Python)

Beitrag von jonathan » 30 Mär 2023, 19:38

Hallo uffi,
ich habe die Auflösung des Bildes mit

Code: Alles auswählen

cam.set(3, 426)
cam.set(4, 240)
umgestellt.

Benutzeravatar
uffi
Beiträge: 404
Registriert: 24 Jan 2014, 16:21
Wohnort: München

Re: TXT Kamera mit OpenCV (Python)

Beitrag von uffi » 01 Apr 2023, 09:45

Hallo jonathan,

danke für Deine schnelle und präzise Antwort, die mir weiterhilft.

Danke und Gruß, uffi

Benutzeravatar
uffi
Beiträge: 404
Registriert: 24 Jan 2014, 16:21
Wohnort: München

Re: TXT Kamera mit OpenCV (Python)

Beitrag von uffi » 18 Jun 2023, 12:33

Hallo Jonathan,

ich habe Deinen Code probiert, aber habe wohl noch einen Fehler drin. Ich nutze die CFW Version 1.0.2.

Hier mein Code:

Code: Alles auswählen

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from TouchStyle import *
import ftrobopy
import cv2
import time

class FtcGuiApplication(TouchApplication):
    def __init__(self, args):
        TouchApplication.__init__(self, args)
        # Creates an empty MainWindow
        w = TouchWindow("Test")
        txt = ftrobopy.ftrobopy('localhost', 65000)
        cam.set(3, 426)
        cam.set(4, 240)
        video = cv2.VideoCapture(0)
        time.sleep(2)		
        res, frame = video.read()

        text = 'OK'  
        if frame == None:
            text = 'None'
        err_msg = QLabel(text)
        err_msg.setWordWrap(True)
        err_msg.setAlignment(Qt.AlignCenter)
        w.setCentralWidget(err_msg)

        w.show()
        self.exec_()        

if __name__ == "__main__":
    FtcGuiApplication(sys.argv)
Kannst Du bitte mal Deinen Code posten, der bei Dir läuft?

Danke, uffi

jonathan
Beiträge: 11
Registriert: 10 Sep 2022, 11:26

Re: TXT Kamera mit OpenCV (Python)

Beitrag von jonathan » 18 Jun 2023, 13:46

Hallo uffi,

so müsste es funktionieren:

Code: Alles auswählen

video = cv2.VideoCapture(0)
time.sleep(2)
video.set(3, 426)
video.set(4, 240)
res, frame = video.read()
 

Benutzeravatar
uffi
Beiträge: 404
Registriert: 24 Jan 2014, 16:21
Wohnort: München

Re: TXT Kamera mit OpenCV (Python)

Beitrag von uffi » 18 Jun 2023, 14:05

Danke für die schnelle Antwort.
Hab den Code nun so modifiziert:

Code: Alles auswählen

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from TouchStyle import *
import ftrobopy
import cv2
import time

class FtcGuiApplication(TouchApplication):
    def __init__(self, args):
        TouchApplication.__init__(self, args)
        # Creates an empty MainWindow
        w = TouchWindow("Test")
        txt = ftrobopy.ftrobopy('localhost', 65000)
        video = cv2.VideoCapture(0)
        time.sleep(2)		
        video.set(3, 426)
        video.set(4, 240)
        res, frame = video.read()

        text = 'OK'  
        if frame == None:
            text = 'None'
        err_msg = QLabel(text)
        err_msg.setWordWrap(True)
        err_msg.setAlignment(Qt.AlignCenter)
        w.setCentralWidget(err_msg)

        w.show()
        self.exec_()        

if __name__ == "__main__":
    FtcGuiApplication(sys.argv)
Leider wird die App sofort abgebrochen.
Kannst Du bitte mal Deinen ganzen Code posten, der läuft?

Danke, uffi

Benutzeravatar
uffi
Beiträge: 404
Registriert: 24 Jan 2014, 16:21
Wohnort: München

Re: TXT Kamera mit OpenCV (Python)

Beitrag von uffi » 18 Jun 2023, 14:09

oder kann es vielleicht sein, dass die CFW 1.0.2 schon openCV version 3 nutzt?

jonathan
Beiträge: 11
Registriert: 10 Sep 2022, 11:26

Re: TXT Kamera mit OpenCV (Python)

Beitrag von jonathan » 18 Jun 2023, 17:34

So funktioniert es bei mir:

Code: Alles auswählen

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from TouchStyle import *
import ftrobopy
import cv2
import time

class FtcGuiApplication(TouchApplication):
    def __init__(self, args):
        TouchApplication.__init__(self, args)
        # Creates an empty MainWindow
        w = TouchWindow("Test")
        txt = ftrobopy.ftrobopy('localhost', 65000)
        video = cv2.VideoCapture(0)
        time.sleep(2)		
        video.set(3, 426)
        video.set(4, 240)
        res, frame = video.read()

        text = 'OK'  
        err_msg = QLabel(text)
        err_msg.setWordWrap(True)
        err_msg.setAlignment(Qt.AlignCenter)
        w.setCentralWidget(err_msg)

        w.show()
        self.exec_()        

if __name__ == "__main__":
    FtcGuiApplication(sys.argv)
 

Das Problem liegt vermutlich an der

Code: Alles auswählen

 if frame == None: 
Abfrage, welche einen Fehler zurückgibt, wenn ein Bild erfolgreich aufgenommen wurde.
Es scheint auch mit Version 1.0.2 zu funktionieren.

Benutzeravatar
uffi
Beiträge: 404
Registriert: 24 Jan 2014, 16:21
Wohnort: München

Re: TXT Kamera mit OpenCV (Python)

Beitrag von uffi » 18 Jun 2023, 17:59

Danke!
Gibt Deine App laufend Kamera-Bilder auf dem Display des TXT aus?
Oder kommt nur der Screen mit "OK" in der Mitte?
Startest Du die App nur mit SSH oder auch aus dem Launcher / Gui?
Zuletzt geändert von uffi am 18 Jun 2023, 18:04, insgesamt 1-mal geändert.

jonathan
Beiträge: 11
Registriert: 10 Sep 2022, 11:26

Re: TXT Kamera mit OpenCV (Python)

Beitrag von jonathan » 18 Jun 2023, 18:04

Bitte.
Nein, die App nimmt nur einmal ein Bild auf und speichert es in der Variable frame.

Benutzeravatar
uffi
Beiträge: 404
Registriert: 24 Jan 2014, 16:21
Wohnort: München

Re: TXT Kamera mit OpenCV (Python)

Beitrag von uffi » 18 Jun 2023, 18:05

Startest Du die App nur mit SSH oder auch aus dem Launcher / Gui?

Antworten