2013-02-25 34 views
2

有沒有人設法讓OpenCV中的Brox密集光流算法工作?OpenCV - Brox Optical Flow - opencv_core244d中的異常!cv :: GlBuffer :: unbind

下面是一些代碼:

{ 
    // Load images 
    cv::Mat PreviousFrameGrayFloat; // Has an image in format CV_32FC1 
    cv::Mat CurrentFrameGrayFloat; // Has an image in format CV_32FC1 

    // Upload images to GPU 
    cv::gpu::GpuMat PreviousFrameGPU(PreviousFrameGrayFloat); 
    cv::gpu::GpuMat CurrentFrameGPU(CurrentFrameGrayFloat); 

    // Prepare receiving variables 
    cv::gpu::GpuMat FlowXGPU; 
    cv::gpu::GpuMat FlowYGPU; 

    // Create optical flow object 
    cv::gpu::BroxOpticalFlow OpticalFlowGPU = cv::gpu::BroxOpticalFlow(0.197f, 0.8f, 50.0f, 10, 77, 10); 

    // Perform optical flow 
    OpticalFlowGPU(PreviousFrameGPU, CurrentFrameGPU, FlowXGPU, FlowYGPU); // EXCEPTION 
    // Exception in opencv_core244d!cv::GlBuffer::unbind 

    // Download flow from GPU 
    cv::Mat FlowX; 
    cv::Mat FlowY; 
    FlowXGPU.download(FlowX); 
    FlowYGPU.download(FlowY); 
} 

我得到一個例外,因爲上述評論的,當我嘗試使用cv::gpu::BroxOpticalFlow對象,我有同樣的問題與cv::gpu::PyrLKOpticalFlow但只有茂密的版本不疏一個,cv::gpu::FarnebackOpticalFlow工作正常...

奇怪。

整個例外是:

Exception at 0x7c812fd3, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in opencv_core244d!cv::GlBuffer::unbind 

我使用的是調試建立與調試庫,使用OpenCV的2.4.4但是代碼也提出了在OpenCV中2.4.3異常。

當我使用OpenCV的2.4.3我得到這個異常:http://stuartjames.info/Journal/opencv-brox-optical-flow-sample-possible-fix.aspx

它看起來像我需要重新編譯的OpenCV:

Exception at 0x7c812fd3, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in opencv_core243d!cv::SparseMat::erase 
+0

是否有演示應用程序或任何證明OpenCV附帶的計算使用情況?這可能是一個很好的開始... – aardvarkk 2013-02-25 17:20:54

+0

我找到了這個,但我希望有一個解決方案,不涉及重新編譯OpenCV ... http:// stuartjames。info/journal/opencv-brox-optical-flow-sample-possible-fix.aspx – 2013-02-25 17:32:54

回答

0

與OpenCV的其他版本的試驗和下面包含的信息後,在這裏與OpenGL。

看來你可以通過運行命令來測試你的OpenCV安裝是否有OpenGL:cv::gpu::setGlDevice(0);如果這個失敗並且出現了像上面那樣的怪異異常,那麼你需要重新編譯。

OpenGL是OpenCV中較新的光流算法需要的數據映射數據到OpenGL紋理到(我假設)加速操作,或者也許只是使代碼更簡單。

因此,畢竟這個解決方案是用OpenGL重新編譯OpenCV。這可以通過在使用CMake配置構建時勾選WITH_OPENGL框來實現。

如果你想使用視頻閱讀器的GPU版本,請確保您還勾選WITH_NVCUVID這是包含CUDA,但不包括在內,除非你要求它...

- 編輯 -

保留的意見後我糾正了我的代碼中的比例因子從問題。

下面是完整的代碼我測試,爲nkint

{ 
    // Load images 
    cv::Mat PreviousFrameGray = cv::imread("Input1.png", 0); 
    cv::Mat CurrentFrameGray = cv::imread("Input2.png", 0); 

    cv::Mat PreviousFrameGrayFloat; // Has an image in format CV_32FC1 
    cv::Mat CurrentFrameGrayFloat; // Has an image in format CV_32FC1 

    PreviousFrameGray.convertTo(PreviousFrameGrayFloat, CV_32FC1, 1.0/255.0); 
    CurrentFrameGray.convertTo(CurrentFrameGrayFloat, CV_32FC1, 1.0/255.0); 

    // Upload images to GPU 
    cv::gpu::GpuMat PreviousFrameGPU(PreviousFrameGrayFloat); 
    cv::gpu::GpuMat CurrentFrameGPU(CurrentFrameGrayFloat); 

    // Prepare receiving variables 
    cv::gpu::GpuMat FlowXGPU; 
    cv::gpu::GpuMat FlowYGPU; 

    // Create optical flow object 
    cv::gpu::BroxOpticalFlow OpticalFlowGPU = cv::gpu::BroxOpticalFlow(0.197f, 50.0f, 0.8f, 10, 77, 10); 

    // Perform optical flow 
    OpticalFlowGPU(PreviousFrameGPU, CurrentFrameGPU, FlowXGPU, FlowYGPU); 

    // Download flow from GPU 
    cv::Mat FlowX; 
    cv::Mat FlowY; 
    FlowXGPU.download(FlowX); 
    FlowYGPU.download(FlowY); 

    // Use FlowX and FlowY in further processing 
    //... 
} 
+0

你現在有一些工作代碼嗎?你可以移植它嗎? – nkint 2013-04-17 16:03:00

+0

一旦您設法重新編譯OpenCV,使用Brox的示例應該可以工作。你是什​​麼意思我可以移植它?我的研究代碼是用C++編寫的,我無意改變它。 CUDA中的OpenCV代碼主要是爲了提高效率而在GPU上運行。 – 2013-04-21 07:35:17

+0

對不起,我想Wrtie post不porak – nkint 2013-04-21 13:24:59

1

的OpenGL是必需的,但也可能是您的尺度參數(50.0f)的問題。它似乎太大了。據我所知,這應該是小於1.如果它是一個很大的數字,該算法快速填充GPU內存。另外,使用擴展(顛倒)圖像金字塔可能沒有意義。雖然不完全確定。

+0

那麼我從我認爲的例子中得到了這些值,但如果是這種情況,那肯定會成爲一個問題。我會玩一玩,看看會發生什麼。 – 2013-04-21 07:31:35

+0

是的,你是完全正確的。當我從例子中獲得我的值時,我得到了伽馬值和比例值的錯誤方式。 'cv :: gpu :: BroxOpticalFlow OpticalFlowGPU(0.197f,50.0f,0.8f,10,77,10);'工程。 – 2013-04-23 09:51:37