Mehrere Kameras über Callback-Funktion kommen sich in die Quere



  • Hej, ich habe gerade ein kleines Problem und weiß nicht mehr, wie ich weiter kommen soll...

    Kurzer Abriss:
    Ich hab ein paar Kameras, deren API einen FrameReadyEvent raus schickt, wenn ein neuer Frame vorliegt und damit dann eine Callback-Funktion aufgerufen wird, die das Kamerabild von der Kamera holt und weiter verarbeitet.
    Jede Kamera hat ihr eigenes Objekt (AVTCapture), die Callback-Funktion weiß, welches Objekt sie aufgerufen hat.
    Jetzt will ich das Kamerabild abspeichern und anzeigen. Klappt auch wunderbar.
    Wenn ich jetzt aber zwei Kameras gleichzeitig laufen lasse, scheinen die sich in die Quere zu kommen. Es wird nur von der ersten Kamera ein Bild gespeichert, welches aber irgendwie die Bilder beider Kameras vermischt.

    Hier mal der Code meiner Callback-Funktion (hab ihn etwas gekürzt):

    VOID_TYPE NOTIFICATION_CALLING_CONVENTION AVTCapture::OnFrameReadyCallback ( S_UNI_CALLBACK_ARGUMENT arg )
    {
      /* This is a static function, so we need to retrieve the object pointer first */
      AVTCapture* This   = reinterpret_cast<AVTCapture*>(arg.m_Parameter);
    
      // Get camera frame
      CALL_CHECKED_RETURN(
            UCC_GetBitmap24ImageEx( This->mID,               // camera to grab
                                    UINT8P_CAST(This->mCVFrame->data),
                                    NULL,
                                    0)               // grab timeout
            ,S_OK,,"Could not grab Bitmap Image");
    
        This->saveFrame();
        This->CVInterface()->proceedFrame();
    }
    

    Jetzt versteh ich nicht ganz, warum die sich in die Quere kommen. Jede Kamera ruft doch ihre eigene Callback-Funktion auf, die jeweils nur auf den Speicher desjenigen Objekts zugreift, welches sie aufgerufen hat.
    Mache ich einen Denkfehler? Habe ich Callback-Funktionen falsch verstanden?

    Würde es was bringen, das auf mehrere Kerne zu verteilen? Also Kamera1 auf Kern1, Kamera2 auf Kern2... Ich hab für den Zweck einen QuadCore zur Verfügung, würde also für die 3 Cams gut reichen. Ich habe allerdings noch nie was mit Mehrkernnutzung gemacht und bevor ich mich darin einarbeite, wollte ich erstmal wissen, ob mir das mein Problem überhaupt lösen könnte...

    Gruß
    Locke



  • Hi Locke,
    mal ins Blaue geschossen: Ich nehme an, dass die Kameras einzelne Threads sind, welche einfach die Callback-Funktion aufrufen. Diese ist wohl nicht threadsicher. Sieh Dir mal so was 'Mutex' oder 'CriticalSection' an.
    Gruß
    Helmut



  • Hej, vielen Dank für die Antwort!
    Die Verwendung von Mutex hat mein Problem in der Tat gelöst 🙂


Anmelden zum Antworten