pvAPI не создает целое изображение с помощью prosilica ge и несколькими потоками

В настоящее время я заново (программирую) драйвер pvapi для OpenCV, и мне не удается добиться потоковой передачи нескольких камер. Когда я использую одну камеру, все работает нормально и плавно, даже при максимальном разрешении, но когда я использую обе камеры, она даже не работает с разрешением 640x480 (максимальное разрешение 1600x1200, и оно отлично работает в моей сетевой конфигурации, поэтому 2 раза 640x480 Это может вызвать проблемы с пропускной способностью. Я проверил это в программе просмотра сэмплов, и она работает.)

Когда я использую более одной камеры, она обновляет только небольшую часть изображения и перестает ждать завершения изображения.

Обе камеры установлены на Bgr24 и ROI 640x480 в середине изображения, PacketSize установлен на 4096, а все остальное по умолчанию. Они подключаются через коммутатор Gigabit Ethernet, который также подключен к ПК со скоростью Gigabit. Программа просто запрашивает изображения и выводит их на экран. Я пытался поточить. Это помогает с задержкой между двумя потоками, но не решает проблему.

Что я делаю не так?

Я использую этот код для получения нового кадра:

int LastIndex = Index - 1;
if(LastIndex == -1) LastIndex = FRAMESCOUNT - 1;

while((Errcode = PvCaptureWaitForFrameDone(Camera.Handle,&(Camera.Frame[Index]), 2000)) != ePvErrSuccess)
    printf("\nCam[%ul]: Waiting for frame to return to host... %u\n", Camera.UID, Errcode);

// if frame hasn't been cancelled, requeue frame
if(Camera.Frame[Index].Status != ePvErrCancelled)
{
    //Check for gaps in FrameCount due to image returning from camera with no frame queued.
    //This should never happen, as we use a multiple frame circular buffer. 
    if(Last + 1 != Camera.Frame[Index].FrameCount)
    {
        printf("missing frame");
    }

    Last = Camera.Frame[Index].FrameCount;
    frame->imageData = (char*) Camera.Frame[Index].ImageBuffer;

    //Requeue [Index] frame of FRAMESCOUNT num frames
    if ((Errcode = PvCaptureQueueFrame(Camera.Handle,&(Camera.Frame[LastIndex]),NULL)) != ePvErrSuccess)
    {
        printf("Cam[%ul]: PvCaptureQueueFrame err %u\n", Camera.UID, Errcode);
    }

    //Increment [Index]
    Index++;
    if(Index==FRAMESCOUNT)
        Index = 0;   

    return true;
}
else
{
    return false;
}

0 ответов

Другие вопросы по тегам