Syntax
INT is_DirectRenderer (HIDS hCam, UINT nMode, void* pParam, UINT nSize)
Beschreibung:
is_DirectRenderer() fasst erweiterte Darstellungsfunktionen zusammen und bietet die Möglichkeit, Overlay-Daten flackerfrei ins Livebild einzublenden. Unter Windows werden Grafikkarten-Funktionen der Direct3D-Bibliothek unterstützt.
•Um die Direct3D-Funktionen nutzen zu können, muss eine entsprechende Version der Microsoft DirectX 9 Runtime auf dem System installiert sein. Installationspakete sind auf den Microsoft Webseiten verfügbar (Stichwort: "DirectX End-User runtime").
•Die Grafikkarte muss mindestens eine Texturgröße (Overlay-Größe) von 768x576 Pixel bei PAL bzw. 640x480 Pixel bei NTSC unterstützen. Die maximale Texturgröße kann über den Parameter DR_GET_MAX_OVERLAY_SIZE abgefragt werden.
•Aktiviert wird die Direct3D Darstellung wie folgt:
is_SetDisplayMode(h, IS_SET_DM_DIRECT3D)
•Für die Darstellung im Direct3D-Modus können verschiedene Farbmodi verwendet werden. Die höchste Leistung wird jedoch erzielt, wenn der Farbmodus des FALCON identisch zum Farbmodus des Windows Desktops ist. In Verbindung mit modernen leistungsfähigen Grafikkarten kann als Grab-Farbformat meist YUV4:2:2 verwendet werden. Dieses Format ist ein 16-Bit pro Pixel Format und weist eine reduzierte PCI/PCIe Busbelastung gegenüber z.B. dem RGB32 Format auf.
•Es kommt vor, dass interne Direct3D Buffer ungültig werden, wenn der Desktop nach bestimmten Aktionen reaktiviert wird (z.B. ein Bildschirmschoner wird durch eine Eingabe inaktiv; nach einem Strg-Alt-Entf). In diesem Fall sind die gezeichneten Overlay-Daten intern verloren. Die Applikation wird jedoch über eine Message (Overlay-Lost-Message) aus dem FALCON Treiber über diese Situation benachrichtigt, so dass diese die Overlay-Daten neu zeichnen kann (Message-Beispiel siehe unten). Diese Message wird sowohl an das Anzeigefenster, als auch an das Elternfenster des Anzeigefensters gesendet. Damit kann die Nachricht auch empfangen werden, wenn das Control, das zur Anzeige verwendet wird, selbst keine Nachrichten verarbeitet. Ausgewertet muss die Nachricht jedoch nur in einem der beiden Fensterhandler.
•Unter Direct3D kann ein stufenloses Skalieren der Darstellung genutzt werden (siehe DR_ENABLE_SCALING). Allerdings können in Verbindung mit der Interlaced-Aufnahme der Bilddaten beim Herunterskalieren subjektiv schlechtere Skalierungsergebnisse auftreten, im Vergleich zur Bilderfassung direkt in der benötigten skalierten Bildgröße.
•Während der Direct3D Modus aktiv ist sind einige FALCON SDK Funktionen nicht nutzbar (Liste siehe unten).
Übergabeparameter
hf |
Handle auf Frame Grabber |
nMode |
Funktionsmodus der Direct3D-Funktion |
DR_GET_OVERLAY_DC |
Gibt das Device-Context-Handle (DC) auf den Overlay-Bereich der Grafikkarte zurück. |
DR_RELEASE_OVERLAY_DC |
Gibt das Device-Context-Handle (DC) wieder frei. |
DR_GET_MAX_OVERLAY_SIZE |
Gibt die Breite x und Höhe y des maximal von der Grafikkarte unterstützen Overlay-Bereichs zurück. |
DR_SET_OVERLAY_SIZE |
Setzt die Größe des Overlay-Bereichs (Voreinstellung: aktuelle Größe des Kamerabilds. |
DR_SET_OVERLAY_POSITION |
Setzt die Position des Overlay-Bereichs. |
DR_GET_OVERLAY_KEY_COLOR |
Gibt die RGB-Werte der aktuellen Key-Farbe zurück (Voreinstellung: Schwarz) |
DR_SET_OVERLAY_KEY_COLOR |
Setzt die RGB-Werte der Key-Farbe. |
DR_SHOW_OVERLAY |
Aktiviert die Overlay-Darstellung über dem aktuellen Kamerabild. |
DR_HIDE_OVERLAY |
Deaktiviert die Overlay-Darstellung. |
DR_ENABLE_SCALING |
Aktiviert die Echtzeitskalierung des Bildes auf die Größe des Anzeigefensters. |
DR_DISABLE_SCALING |
Deaktiviert die Echtzeitskalierung. |
DR_ENABLE_SEMI_TRANSPARENT_OVERLAY |
Aktiviert eine halbtransparente Darstellung des Overlay-Bereichs. |
DR_DISABLE_SEMI_TRANSPARENT_OVERLAY |
Deaktiviert die halbtransparente Darstellung des Overlay-Bereichs. |
DR_SET_VSYNC_AUTO |
Aktiviert die Synchronisierung der Bilddarstellung mit dem Bildaufbau des Monitors. Das Bild wird mit dem nächsten VSYNC-Signal des Monitors dargestellt. |
DR_SET_VSYNC_OFF |
Deaktiviert die Synchronisierung der Bilddarstellung. Das Bild wird sofort dargestellt. |
DR_SET_USER_SYNC |
Aktiviert die Synchronisierung der Bilddarstellung auf eine vom Anwender vorgegebene Bildzeile. |
DR_GET_USER_SYNC_POSITION_RANGE |
Gibt die minimale und maximale mögliche Zeilenposition für DR_SET_USER_SYNC zurück. |
DR_LOAD_OVERLAY_FROM_FILE |
Lädt ein Bitmap-Bild (*.BMP-Datei) in den Overlay-Bereich. Wenn das Bitmap-Bild größer ist als der Overlay-Bereich, wird das Bitmap-Bild beschnitten. |
DR_CLEAR_OVERLAY |
Löscht die Daten des Overlay-Bereichs durch Füllen mit der Farbe Schwarz. |
DR_STEAL_NEXT_FRAME |
Kopiert das nächste Bild in den aktiven Benutzerspeicher, der mit is_SetImageMem()gesetzt wurde (Steal-Funktion). |
DR_SET_STEAL_FORMAT |
Setzt das Farbformat für die Steal-Funktion identisch zu is_PrepareStealVideo() |
DR_GET_STEAL_FORMAT |
Gibt das eingestellte Farbformat für die Steal-Funktion zurück. |
DR_SET_HWND |
Setzt ein neues Fenster-Handle für die Bildausgabe unter Direct3D. Dadurch muss jedoch FALCON-intern das Direct3D Interface neu initialisiert werden, so dass alle Overlay-Daten gelöscht werden und von der Applikation neu gezeichnet werden müssen. Die Applikation wird hierüber jedoch durch die Overlay-Lost-Message informiert (siehe auch Beschreibung oben). |
DR_CHECK_COMPATIBILITY |
Gibt zurück, ob die Grafikkarte die benötigten Direct3D Funktionen unterstützt. |
DR_CHECK_COLOR_MODE_SUPPORT |
Überprüft, ob die angegebenen Farbmodi für die Darstellung möglich sind. Es muss der FALCON Farbmodus als Quellmodus und der VGA-Farbmodus als Zielmodus angegeben werden. |
pParam |
Zeiger vom Typ void auf ein Datenobjekt oder ein Array von Objekten (abhängig vom mit nMode ausgewählten Modus). |
nSize |
Größe des Datenobjekts bzw. des Arrays in Byte |
Rückgabewerte
In Verbindung mit DR_CHECK_COMPATIBILITY |
IS_DR_DEVICE_CAPS_INSUFFICIENT Die Grafikhardware bietet keine vollständige Unterstützung für die benötigten Direct3D-Funktionen |
In Verbindung mit DR_CHECK_COLOR_MODE_SUPPORT |
IS_DR_DEVICE_CAPS_INSUFFICIENT Die Grafikhardware kann die angegebene Farbraumumrechnung nicht in Hardware durchführen. |
IS_SUCCESS |
Allgemeine Erfolgsmeldung |
IS_NO_SUCCESS |
Allgemeine Fehlermeldung |
IS_DR_LIBRARY_NOT_FOUND |
Die DirectRenderer-Bibliothek konnte nicht gefunden werden. |
IS_DR_DEVICE_OUT_OF_MEMORY |
Nicht genügend Grafikspeicher verfügbar. |
IS_DR_CANNOT_CREATE_SURFACE |
Bild- oder Overlay-Surface konnten nicht angelegt werden. |
IS_DR_CANNOT_CREATE_VERTEX_BUFFER |
Der Vertex-Puffer konnte nicht angelegt werden. |
IS_DR_CANNOT_CREATE_TEXTURE |
Die Textur konnte nicht angelegt werden. |
IS_DR_CANNOT_LOCK_OVERLAY_SURFACE |
Das Overlay-Surface konnte nicht gesperrt werden. |
IS_DR_CANNOT_UNLOCK_OVERLAY_SURFACE |
Das Overlay-Surface konnte nicht entsperrt werden. |
IS_DR_CANNOT_GET_OVERLAY_DC |
Das Device-Context-Handle für das Overlay konnte nicht freigegeben werden. |
IS_DR_CANNOT_RELEASE_OVERLAY_DC |
Das Overlay-Surface konnte nicht freigegeben werden. |
IS_DR_DEVICE_CAPS_INSUFFICIENT |
Die Funktion wird von der Grafikhardware nicht unterstützt. |
IS_DR_SURFACE_LOST |
Das Overlay-Surface wurde verloren und musste neu erzeugt werden. |
IS_DR_CANNOT_LOCK_IMAGE_SURFACE |
Das Bild-Surface konnte nicht gesperrt werden. |
IS_DR_CANNOT_UNLOCK_IMAGE_SURFACE |
Das Bild-Surface konnte nicht entsperrt werden. |
Während des Direct3D Modus nicht nutzbare Funktionen
Beispiele
//------------------------------------
// DC-Handle
//------------------------------------
// DC-Handle auf das Overlay holen
HDC hDC;
is_DirectRenderer (h, DR_GET_OVERLAY_DC, (void*)&hDC, sizeof (hDC));
// DC-Handle freigeben
is_DirectRenderer (h, DR_RELEASE_OVERLAY_DC, NULL, NULL);
//------------------------------------
// Overlay-Größe
//------------------------------------
//Maximale Größe des Overlay-Bereichs abfragen
UINT OverlaySize[2];
is_DirectRenderer (h, DR_GET_MAX_OVERLAY_SIZE,
(void*)OverlaySize, sizeof(OverlaySize));
INT nWidth = OverlaySize[0];
INT nHeight = OverlaySize[1];
//Größe des Overlay-Bereichs setzen
UINT Size[2];
Size[0] = 100;
Size[1] = 120;
is_DirectRenderer (h, DR_SET_OVERLAY_SIZE, (void*)Size, sizeof (Size));
//Position des Overlay-Bereichs setzen
UINT Position[2];
Position[0] = 20;
Position[1] = 0;
is_DirectRenderer (h, DR_SET_OVERLAY_POSITION,
(void*)Position, sizeof (Position));
//------------------------------------
// Key-Farbe
//------------------------------------
//Aktuelle Key-Farbe auslesen
UINT OverlayKeyColor[3];
is_DirectRenderer (h, DR_GET_OVERLAY_KEY_COLOR,
(void*)OverlayKeyColor, sizeof(OverlayKeyColor));
INT nRed = OverlayKeyColor[0];
INT nGreen = OverlayKeyColor[1];
INT nBlue = OverlayKeyColor[2];
//Neue Key-Farbe setzen
OverlayKeyColor[0] = GetRValue(m_rgbKeyColor);
OverlayKeyColor[1] = GetGValue(m_rgbKeyColor);
OverlayKeyColor[2] = GetBValue(m_rgbKeyColor);
is_DirectRenderer (h, DR_SET_OVERLAY_KEY_COLOR,
(void*)OverlayKeyColor, sizeof(OverlayKeyColor));
//------------------------------------
// Anzeige
//------------------------------------
//Overlay anzeigen
is_DirectRenderer (h, DR_SHOW_OVERLAY, NULL, NULL);
//Overlay ausblenden
is_DirectRenderer (h, DR_HIDE_OVERLAY, NULL, NULL);
//------------------------------------
// Skalierung
//------------------------------------
//Skalierung aktivieren
is_DirectRenderer (h, DR_ENABLE_SCALING, NULL, NULL);
//Skalierung deaktivieren
is_DirectRenderer (h, DR_DISABLE_SCALING, NULL, NULL);
//------------------------------------
// Transparenz
//------------------------------------
//Halbtransparentes Overlay aktivieren
is_DirectRenderer (h, DR_ENABLE_SEMI_TRANSPARENT_OVERLAY, NULL, NULL);
//Halbtransparentes Overlay deaktivieren
is_DirectRenderer (h, DR_DISABLE_SEMI_TRANSPARENT_OVERLAY, NULL, NULL);
//------------------------------------
// Synchronisation
//------------------------------------
//Auto-Synchronisation aktivieren
is_DirectRenderer (h, DR_SET_VSYNC_AUTO, NULL, NULL);
//Benutzerdefinierte Synchronisation: Bereich abfragen + Sync-Pos. setzen
UINT UserSync[2];
is_DirectRenderer (h, DR_GET_USER_SYNC_POSITION_RANGE,
(void*)UserSync, sizeof (UserSync));
INT Min = UserSync[0];
INT Max = UserSync[1];
INT SyncPosition = 400;
is_DirectRenderer (h, DR_SET_USER_SYNC,
(void*)&SyncPosition, sizeof (SyncPosition));
//Synchronisation deaktivieren
is_DirectRenderer (h, DR_SET_VSYNC_OFF, NULL, NULL);
//------------------------------------
// BMP-Datei
//------------------------------------
//Overlay aus BMP-Datei laden
is_DirectRenderer (h, DR_LOAD_OVERLAY_FROM_FILE,
(void*)”c:\test.bmp”, NULL);
//------------------------------------
// Löschen
//------------------------------------
//Overlay-Bereich löschen
is_DirectRenderer (h, DR_CLEAR_OVERLAY, NULL, NULL);
//------------------------------------
// Steal-Funktion
//------------------------------------
//Farbmodus für kopiertes Bild abfragen und setzen
INT nColorMode;
is_DirectRenderer (h, DR_GET_STEAL_FORMAT,
(void*)&nColorMode, sizeof (nColorMode));
nColorMode = IS_CM_Y8;
is_DirectRenderer (h, DR_SET_STEAL_FORMAT,
(void*)&nColorMode, sizeof (nColorMode));
//Bild kopieren, Funktion wartet
INT nwait = IS_WAIT;
is_DirectRenderer(h, DR_STEAL_NEXT_FRAME,
(void*)&wait, sizeof (wait));
//------------------------------------
// Fenster-Handle
//------------------------------------
//Setzt ein neues Fenster-Handle für die Bildausgabe
is_DirectRenderer (h, DR_SET_HWND, (void*)&hWnd, sizeof (hWnd));
//------------------------------------
// Kompatibilität
//------------------------------------
//Kompatibilität der Grafikkarte prüfen
INT nRet = is_DirectRenderer (h, DR_CHECK_COMPATIBILITY, NULL, NULL);
if (nRet == IS_DR_DEVICE_CAPS_INSUFFICIENT )
//Grafikkarte unterstützt keine uEye Direct3D-Funktionen
//------------------------------------
// Farbmodus prüfen
//------------------------------------
INT nVgaMode;
// Aktuellen Farbmodus des Desktops ermitteln
INT nRet = is_GetColorDepth(h, NULL, &nVgaMode);
INT Modes[2];
Modes[0] = IS_SET_CM_RGB16; // Quellmodus des FALCON (z.B.)
Modes[1] = nVgaMode; // Zielmodus der Grafikkarte
// Quell- und Zielmodus prüfen
nRet = is_DirectRenderer(h, DR_CHECK_COLOR_MODE_SUPPORT, Modes,
2 * sizeof(INT));
if (nRet == IS_DR_DEVICE_CAPS_INSUFFICIENT )
//Grafikkarte unterstützt die angegebene Farbraumkonvertierung nicht
//------------------------------------
// "Overlay Lost" Nachricht
//------------------------------------
// Beispiel für einen Nachrichtenhandler in MFC Applikationen
// in XX_sample.h
afx_msg LRESULT OnFalconMessage(WPARAM wParam, LPARAM lParam);
// in XX_sample.cpp
BEGIN_MESSAGE_MAP(...)
...
ON_MESSAGE(IS_FALCON_MESSAGE, OnFalconMessage)
END_MESSAGE_MAP()
LRESULT CXX_class::OnFalconMessage(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{
case IS_MSG_OVERLAY_DATA_LOST:
// redraw the overlay data here
...
break;
} // end switch(wParam)
return 0;
} // end LRESULT CXX_class::OnFalconMessage