Webcam Anbindung und Darstellung mittels QT

Alles rund um die Programmierung mit Qt
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag von gerd87 »

Werde dann wohl auf die Klasse QTGlContext verzichten müssen.
Trotzdem vielen Dank für deine Hilfe.

Gibt es vielleicht noch eine andere möglichkeit das Format von IplImage zu QImage zu konvertieren, oder zu irgendetwas, das man mit QT anzeigen kann?
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Code: Alles auswählen

	
        IplImage* iplImage = das IplImage von irgendwo
        unsigned int m_width = iplImage->width;
        unsigned int m_height = iplImage->height;
        unsigned int m_depth = iplImage->depth * iplImage->nChannels;
        unsigned char* m_imgP = (unsigned char*) iplImage->imageDataOrigin;

        // initalisiere variable mit 0
        QImage* img = 0;

	int i, j;
	switch(m_depth)
	{
	case 8:
		img = new QImage(QSize(m_width, m_height),QImage::Format_Indexed8);
		img->setNumColors(256);
		for (i = 0; i<256; ++i)
			img->setColor(i, qRgb(i,i,i));
		break;
	case 24:
	case 32:
		img = new QImage(QSize(m_width, m_height),QImage::Format_RGB32);
		break;
	}
	
	for (i = 0; i<m_height; ++i)
	{
		for (j = 0; j<m_width; ++j)
		{
			switch(m_depth)
			{
			case 8:
				img->setPixel(j,i, m_imgP[i * m_width + j ]);
				break;
			case 24:				
			case 32:                                
				if (m_bgr)
				{
					img->setPixel(j,i, qRgb(
					m_imgP[i * m_width * (m_depth>>3) + j * (m_depth>>3) + 2],
					m_imgP[i * m_width * (m_depth>>3) + j * (m_depth>>3) + 1],
					m_imgP[i * m_width * (m_depth>>3) + j * (m_depth>>3)])
					);			
				}
				else
				{
					img->setPixel(j,i, qRgb(
					m_imgP[i * m_width * (m_depth>>3) + j * (m_depth>>3)], 
					m_imgP[i * m_width * (m_depth>>3) + j * (m_depth>>3) + 1], 
					m_imgP[i * m_width * (m_depth>>3) + j * (m_depth>>3) + 2])
					);			
				}
			}
		}
	}

// Mach irgendwas mit dem Bild und vergess nicht es danach wieder zu löschen
delete img;
Dabei ist m_width die Breite des Bildes, m_depth die Farbtiefe in Bits und m_height die Höhe des Bildes.
Bei IplImages solltest Du statt m_width * (m_depth >>3), widthStep verwenden, da cvCreateImage die Bilder 4byte Aligned erzeugt.

m_imgP entspricht dem IplImage imageData Feld.

Hoffe das hilft weiter, auch wenn's bei weitem nicht so schnell ist wie die OpenGL Variante
Zuletzt geändert von Volker am 20. April 2007 21:17, insgesamt 4-mal geändert.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Christian81 hat geschrieben:Das hast Du davor nicht gesagt. Ich bin von msvc ausgegangen.

MinGW definiert diese Konstanten nicht, also ist es atm mit MinGW wohl nicht möglich. Sollte man mal bei http://sf.net/projects/mingw nachschauen ob sie ggf. planen diese Konstanten hinzuzufügen.
warum sagst du dass es mit dem MINGW compiler nicht geht?
es geht wunderbar.....

Code: Alles auswählen

svn co https://qt-webdav.svn.sourceforge.net/svnroot/qt-webdav/webcam_qt4_demo_mingw/ qt4webcamdemo 
so wie es im file https://qt-webdav.svn.sourceforge.net/s ... readme.txt
auf meinem komischen englisch geschrieben ist geht es prima!


Bild
.........................
speack português italiano deutsch english castellà qt
silentstorm
Beiträge: 3
Registriert: 19. April 2007 18:17

Beitrag von silentstorm »

Hallo Volker,

ich habe da noch ein paar Fragen an dich bzgl deines Codes der die Pixel kopiert.

Code: Alles auswählen

char* data = frame->imageData;
   int m_width = frame->width;
   int m_height = frame->height;
   int m_depth = frame->width*frame->nChannels;
   QImage* img = 0;//new QImage;

   int i, j;
   switch(m_depth)
   {
   case 8:
      img = new QImage(QSize(m_width, m_height),QImage::Format_Indexed8);
      img->setNumColors(256);
      for (i = 0; i<256; ++i)
         img->setColor(i, qRgb(i,i,i));
      break;
   case 24:
   case 32:
      img = new QImage(QSize(m_width, m_height),QImage::Format_RGB32);
      break;
   }
   
   for (i = 0; i<m_height; ++i)
   {
      for (j = 0; j<m_width; ++j)
      {
         switch(m_depth)
         {
         case 8:
            img->setPixel(j,i, data[i * m_width + j ]);
            break;
         case 24:            
         case 32:
            if (true)//m_bgr->isChecked())
            {
               img->setPixel(j,i, qRgb(
               data[i * m_width * (m_depth>>3) + j * (m_depth>>3) + 2],
               data[i * m_width * (m_depth>>3) + j * (m_depth>>3) + 1],
               data[i * m_width * (m_depth>>3) + j * (m_depth>>3)])
               );         
            }
            else
            {
               img->setPixel(j,i, qRgb(
               data[i * m_width * (m_depth>>3) + j * (m_depth>>3)],
               data[i * m_width * (m_depth>>3) + j * (m_depth>>3) + 1],
               data[i * m_width * (m_depth>>3) + j * (m_depth>>3) + 2])
               );         
            }
         }
      }
   }
   cout << img->isNull() << endl;
1tens zu QImage* img = 0; sollte man statt der 0 nicht new QImage; schreiben?

2tens zu m_depth.Berechnet man m_depth schon nach dieser Formel: frame->width*frame->nChannels

3tens zu m_bgr->isChecked(). Was ist m_bgr und woher kommt die Funktion isChecked()?Da ich es bisher nicht wusste,benutz ich einfach mal true.

Auf jedenfall is mein Qimage noch ein null image, da bei der Abfragen auf isNull true geliefert wird.

Sobald ich das QImage habe bin ich fertig, da ich mittels der Funktion fromImage das Qimage in ein QPixmap umwandel und mir dieses auf einem Widget anzeige.

Ich hoffe du kannst mir die 3 Fragen beantworten. Ich wär dir für deine Hilfe sehr dankbar.

Grüße,
silentstorm



edit:
wenn ich es über qtglcontext probiere kommt folgender fehler:

Code: Alles auswählen

Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
QGLContext::makeCurrent(): Cannot make invalid context current.
Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
### image webcam  
benutze von nvidia die standard treiber in ubuntu.
in der xorg.conf wird glx geladen.
soll ich mal probieren die nvidia treiber zu installieren?
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

silentstorm hat geschrieben: ich habe da noch ein paar Fragen an dich bzgl deines Codes der die Pixel kopiert.
1tens zu QImage* img = 0; sollte man statt der 0 nicht new QImage; schreiben?
Nein! Denn das wird nur in den Fällen wo die Konvertierung funktioniert beim "case" Code erzeugt.
silentstorm hat geschrieben: 2tens zu m_depth.Berechnet man m_depth schon nach dieser Formel: frame->width*frame->nChannels
Nein! m_depth soll die Farbtiefe des Bildes darstellen, da hat die Breite nichts verloren.
silentstorm hat geschrieben: 3tens zu m_bgr->isChecked(). Was ist m_bgr und woher kommt die Funktion isChecked()?Da ich es bisher nicht wusste,benutz ich einfach mal true.
Das ist zugegebenermaßen nicht von mir erklärt worden. Unter Windows sind Videodaten in der Regel BGR statt RGB, weiss nicht wie das unter Linux ist.
silentstorm hat geschrieben: Auf jedenfall is mein Qimage noch ein null image, da bei der Abfragen auf isNull true geliefert wird.
Wenn du m_depth wie oben von dir erwähnt berechnet wird, ist das kein Wunder, denn dann trifft ja kein Fall für dich zu.
silentstorm hat geschrieben: Sobald ich das QImage habe bin ich fertig, da ich mittels der Funktion fromImage das Qimage in ein QPixmap umwandel und mir dieses auf einem Widget anzeige.
Wie bereits erwähnt kann man das so machen, is aber langsam. Außerdem solltest Du nicht vergessen, die QImages die du so erzeugst auch wieder zu löschen.

silentstorm hat geschrieben: edit:
wenn ich es über qtglcontext probiere kommt folgender fehler:

Code: Alles auswählen

Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
QGLContext::makeCurrent(): Cannot make invalid context current.
Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
Xlib:  extension "GLX" missing on display ":0.0".
### image webcam  
benutze von nvidia die standard treiber in ubuntu.
in der xorg.conf wird glx geladen.
soll ich mal probieren die nvidia treiber zu installieren?
Keine Ahnung, mit Linux hab ich in der Beziehung wenig Erfahrung.

Ich hab den Code in meinem ursprünglichen Posting noch erweitert, so dass die Zuordnung zwischen meinen Variablen und IplImage klar werden sollte. Ich hab statt meinem ursprünglich vorgeschlagenen imageData Feld von IplImage, das imageDataOrigin verwendet, angeblich bekommt man da das Bild non-aligned, bzw. so wie's ursprünglich angelegt wurde. Hab ich selbst aber noch nicht probiert.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
silentstorm
Beiträge: 3
Registriert: 19. April 2007 18:17

Beitrag von silentstorm »

hab den fehler gefunden. hatte zwar die nvidia treiber installiert aber den befehl
nvidia-glx-config enable vergessen ^^
nico123
Beiträge: 16
Registriert: 24. September 2007 08:29

Beitrag von nico123 »

Hi,
dieser Post ist zwar scon älter. Aber ich bin gerad erst darauf gestossen Also ich arbeite mit cpp und MinGW. Ich kann so weit auch alles ohne Warnungen und Fehler compilieren. Allerdings komme ich mit diesen Zeilen nicht ganz klar:

Um nun ein IplImage anzuzeigen, fügt man die angehängte Klasse QtGLContext in ein beliebiges Widget ein (z.B. als centralWidget von QMainWindow) und ruft die Methode setImage von QtGLContext auf.

Wie muss ich die Klasse einfügen? Ich habe bereits ein QMainWindow mit einem centralWidget und mehreren Buttons etc. Wenn ich das so mache:

Code: Alles auswählen

mwindow::mwindow( QWidget *parent, Qt::WFlags f) 
	: QMainWindow(parent, f)
{
    setupUi(this);
    QtGLContext w;
}

Stürzt eine Applikation sofot ab.

Ich hoffe ihr mögt und könnt mir helfen.


Vielen Dank & Gruß
Nico

Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Schon nen Debugger verwendet?

Mal abgesehen davon, dass es wenig Sinn macht die QtGLWidget Instanz im Konstruktor auf dem Stack zu erzeugen, fällt mir sonst nichts absturzverursachendes auf.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
nico123
Beiträge: 16
Registriert: 24. September 2007 08:29

Beitrag von nico123 »

Hi,
ich bin jetzt von MinGW nach MS Visual C++ umgestiegen. Hatte ich so wieso schon länger vor. Naja. Aufjeden Fall hier mein Debugger Output:

Code: Alles auswählen

"test_and_qt.exe": "C:\Documents and Settings\Nico\Desktop\Workspace\ovc\test_and_qt\debug\test_and_qt.exe" geladen, Symbole wurden geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\ntdll.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\kernel32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\qt4\bin\QtOpenGL4.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt.
"test_and_qt.exe": "C:\WINDOWS\system32\opengl32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\msvcrt.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\advapi32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\rpcrt4.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\gdi32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\user32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\glu32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\ddraw.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\dciman32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\qt4\bin\QtGui4.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt.
"test_and_qt.exe": "C:\WINDOWS\system32\comdlg32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\shlwapi.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\comctl32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\shell32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\oleaut32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\ole32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\imm32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\winmm.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\winspool.drv" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\qt4\bin\QtCore4.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt.
"test_and_qt.exe": "C:\WINDOWS\system32\ws2_32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\ws2help.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700\msvcp80.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700\msvcr80.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\Documents and Settings\Nico\Desktop\Workspace\ovc\test_and_qt\debug\highgui100.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\Documents and Settings\Nico\Desktop\Workspace\ovc\test_and_qt\debug\cxcore100.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\Documents and Settings\Nico\Desktop\Workspace\ovc\test_and_qt\debug\libguide40.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt.
"test_and_qt.exe": "C:\WINDOWS\system32\avifil32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\msacm32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\msvfw32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\avicap32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\version.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\qt4\bin\QtGuid4.dll" geladen, Symbole wurden geladen.
"test_and_qt.exe": "C:\qt4\bin\QtCored4.dll" geladen, Symbole wurden geladen.
"test_and_qt.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\msvcp80d.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\msvcr80d.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\uxtheme.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\MSCTFIME.IME" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\Wintab32.dll" geladen, Keine Symbole geladen.
"test_and_qt.exe": "C:\WINDOWS\system32\Wacom_Tablet.dll" geladen, Keine Symbole geladen.
Das Programm "[932] test_and_qt.exe: Systemeigen" wurde mit Code 1 (0x1) beendet.
Also ich denke mal das Problem liegt daran dass in bestimmten DLL's keine Debug Infos gefunden werden können. Ich habe qt aber so compiliert dass ich einmal die debug und release DLL's habe. Frage ist nur, warum werden die Debug DLL's nich verwendet.
Wenn ich nämlich das ganze als Release compiliere läuft alles.
Bleibt denne auch noch die Frage. Wie baue ich das ganze z.B in mein CentralWidget ein. Also ich weiss auch nicht, ich blicke das nicht so ganz. Vllt. ist es auch schon ein bisschen spät/früh ;-)



Vielen Dank & Gruß
Nico
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

nico123 hat geschrieben:Ich habe schon ein wenig rumgebastelt, das einzigste was ich von dem GLWidget zu sehen bekomme, ist eine Weisse fläche. Mehr nicht. So habe ich das versucht:
QtGLContext *openGL = new QtGLContext();
imw->addWidget(openGL);
imw->setCurrentIndex(2);
Imw ist ein StackedWidget.
Also prinzipiell lässt sich das QtGLContext Widget auch als centralWidget oder beliebig anders verwenden (ist ja auch nur von QGLWidget abgeleitet).

Und zum Thema Debugger: Das Ausgabefenster oder sich darin befindende Output ist kein Debugger. Ich meinte damit eher, dass Du mal einen Breakpoint setzen sollst und dir den Inhalt der Variablen anschaust oder dir den Callstack anschaust wenn's abstürzt.

Wenn Du eine weiße Fläche angezeigt bekommst, dann wird vermutlich drawTexture nicht aufgerufen, da die m_imgP Variable nicht gesetzt ist.
Hast du setImage aufgerufen?
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Hallo,

generell gibt es mehrere Möglichkeiten eine Webcam/IpCam anzuzeigen.

Sehr simpel und portabel ist die Möglichkeit mit QHttp Einzelbilder vom Webinterface der Kamera abzuholen. Hierbei kann man, je nach Kamera durchaus gute Ergebnisse erzielen. Bei einigen Kameratypen muss man sich noch mit JPEG-Stremas rumschlagen, aber die bekommt man auch in den Griff.

Komplizierter aber auch nicht so übel ist die Integration von Quicktime.

Weiterhin gibt es auch zu vielen Kameras (eher im professionellen Bereich) SDKs oder ActiveX-Controls zur Anzeige/Steuerung der Kameras.

Ciao,
Sephral
nico123
Beiträge: 16
Registriert: 24. September 2007 08:29

Beitrag von nico123 »

Hi,
@volker: Es geht jetzt. Vielen Dank. Lag irgendwie an der auf Debug compilierten Variante. Warum auch immer. Ins Widget hab ich so reinbekommen:

Code: Alles auswählen

renderGL = new QtGLContext(imw);
	imw->addWidget(renderGL);
	imw->setCurrentIndex(2);
Aber einmal muss ich noch was fragen ;-)
Im Moment ist deine Klasse ja so, dass ein Bild immer auf den Kompletten Render Bereich gestreckt wird. Gibt es auch eine Möglichkeit das Bild in original Größe zentriert dar zu stellen? Zu große Bilder sollten dann verkleinert werden. Ich bastel da jetzte schon ein bisschen dran rum, leider aber ohne Erfolg. Hab da ein bisschen am glViewPort was gemacht, hab aber nicht so ganz hingehaun. Kleine Bilder werden nun fast in original Größe dargestellt und auch zentriert. Zu große aber gar nicht.

Vielen Dank & Gruß
Nico
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Das ist eher ein OpenGL Problem. Prinzipiell gibst du mit den glVertex2f die Koordinaten für die Textur an. Da die Projektionsmatrix auf glOrtho gestellt ist mit den Frustum Begrenzungen X[-1 1] Y[-1 1] und die Angaben für die Textur auf glVertex2f( -1, -1 ) bis glVertex2f( 1, 1 ) sollte die Textur eigentlich immer den kompletten Viewport ausfüllen. Wenn Du das anders haben willst, musst du das entsprechend handhaben. Aber wie schon gesagt, das ist dann eher ein OpenGL Problem.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
nico123
Beiträge: 16
Registriert: 24. September 2007 08:29

Beitrag von nico123 »

Volker hat geschrieben:Das ist eher ein OpenGL Problem. Prinzipiell gibst du mit den glVertex2f die Koordinaten für die Textur an. Da die Projektionsmatrix auf glOrtho gestellt ist mit den Frustum Begrenzungen X[-1 1] Y[-1 1] und die Angaben für die Textur auf glVertex2f( -1, -1 ) bis glVertex2f( 1, 1 ) sollte die Textur eigentlich immer den kompletten Viewport ausfüllen. Wenn Du das anders haben willst, musst du das entsprechend handhaben. Aber wie schon gesagt, das ist dann eher ein OpenGL Problem.
Ok. Vielen Dank. Ist dann auch eine schöne Möglichkeit meine OpenGL Kenntnisse zu erweitern/verbessern.

Gruß
Nico
Antworten