Я пытаюсь сшить изображение с живой видеокамеры (больше похоже на панораму), используя OpenCv. Шить нормально работает. Моя проблема в том, что я хочу, чтобы строчка выполнялась в режиме реального времени, скажем, около 30 миль в час, но обработка строчки идет медленно.
Я хочу использовать потоки, чтобы улучшить скорость, но для их использования мне нужно хранить мой живой видеопоток или есть какой-либо способ напрямую использовать потоки для прямого потока.
Вот пример кода:
SapAcqDevice *pAcq=new SapAcqDevice("Genie_HM1400_1", false);
SapBuffer *pBuffer = new SapBuffer(20,pAcq);
SapView *pView=new SapView(pBuffer,(HWND)-1);
SapAcqDeviceToBuf *pTransfer= new SapAcqDeviceToB(pAcq,pBuffer,XferCallback,pView);pAcq->Create();
pBuffer->Create();
pView->Create();
pTransfer->Create();
pTransfer->Grab();
printf("Press any key to stop grab\n");
getch();
pTransfer->Freeze();
pTransfer->Wait(5000);
printf("Press any key to terminate\n");
getch();
Этот код выше используется для захвата живого потока. Функция XferCallback используется для обработки кадров. В этой функции я называю мой двигатель стежка. Поскольку обработка двигателя медленная, я хочу использовать потоки.
Вот пример кода функции обратного вызова:
SapView *pView = (SapView *) pInfo->GetContext();
SapBuffer *pBuffer;
pBuffer = pView->GetBuffer();
void *pData=NULL;
pBuffer->GetAddress(&pData);
int width=pBuffer->GetWidth();
int height=pBuffer->GetHeight();
int depth=pBuffer->GetPixelDepth();
IplImage *fram;
fram = cvCreateImage(cvSize(width,height),depth,1);
cvSetImageData(fram,pData,width);
stitching(frame_num , fram);
cvWaitKey(1);
frame_num++;
Я хочу, чтобы на стежковом двигателе работало много ниток.
Если вы думаете, что можете сшить нитки достаточно быстро, используйте потоки.
Нужно ли мне хранить видео в реальном времени или есть ли способ
напрямую использовать темы для прямой трансляции.
Вы могли бы выиграть от установки кольцевого буфера с предварительно выделенными кадрами. Вы знаете, что размер изображения не изменится. Таким образом, ваш обратный вызов захвата Sapera просто помещает кадр в буфер.
Затем у вас есть другой поток, который работает так быстро, как только может, и поддерживает информацию о состоянии, чтобы помочь оптимизировать следующий цикл. Вы не дали много информации о процессе сшивания, но, вероятно, вы можете сделать это параллельно с OpenMP. Если это достаточно быстро, чтобы не отставать от захвата кадра, то все будет в порядке. Если нет, то вы начнете отбрасывать кадры, потому что ваш кольцевой буфер заполнен.
Как указывалось выше, вы, вероятно, можете предсказать, где должна начаться строчка для следующего кадра. Это основано на том, что движение между одним кадром и следующим должно быть достаточно небольшим и / или плавным. Таким образом, вы сузите свой поиск и значительно улучшите скорость.
Других решений пока нет …