2012-10-09 246 views
-3

我正在嘗試使用OpenCv拼接從實時視頻相機(更像是全景圖像)的圖像。縫合工作正常。我的問題是,我想要實時完成拼接,例如30 mph左右,但拼接的處理速度很慢。從OpenCv中的實時視頻流拼接圖像

我想使用線程來提高速度,但爲了使用它們,我需要存儲我的實時視頻流還是有任何方法直接使用線程的直播流。

下面是一個示例代碼:

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++; 

我想多線程關於針腳發動機的工作。

回答

0

如果您認爲使用線程可以足夠快地進行拼接,那就去做吧。

我需要存儲我的實時視頻流還是有任何方法可以直接使用線程進行直播。

您可能會從使用預分配幀設置環形緩衝區中受益。你知道圖像大小不會改變。所以您的Sapera採集回調只是將一幀推入緩衝區。

然後,您將有另一個線程,它可以儘可能快地拼接並保持狀態信息以幫助優化下一個針跡。您沒有提供關於拼接過程的很多信息,但推測可以使其與OpenMP平行。如果速度足以跟上幀採集,那麼你會好起來的。如果沒有,那麼你將開始丟幀,因爲你的環形緩衝區已滿。

如上所示,您可以預測下一幀拼接的位置應該開始。這是基於一幀和下一幀之間的移動應該合理地小和/或平滑。這樣你縮小搜索範圍並大大提高速度。

+0

我想用多線程以更快的速度進行處理。事實上,我打算切換到CUDA。就像你說的那樣,拼接過程只是按順序添加幀,結果圖像是所有幀的拼接圖像。你能給我一個示例代碼來做到這一點。我是新的和無助的。 – Vinshi

+0

您甚至沒有顯示您現有的拼接代碼,並且您要求我爲您編寫一個平行的代碼。我真的無法承擔時間投資。我只是想提供一些可能有用的建議。 – paddy

+0

拼接功能以幀和幀號爲參數:拼接(frame_num,frame)。結果圖像根據幀編號堆疊。代碼對我來說在這裏輸入真的很長。請原諒我。對於這個功能,我想使用線程。所以我想知道是否需要存儲視頻,而不是直接在回調函數中調用拼接函數。 – Vinshi