2013-02-25 12 views
2

누구나 OpenCV에서 Brox 밀도 광학 흐름 알고리즘을 사용할 수 있습니까? 나는 시도하고 cv::gpu::BroxOpticalFlow 객체를 사용할 때, 나는 cv::gpu::PyrLKOpticalFlow와 같은 문제 만 조밀 한 버전이 아닌 스파 스 하나가, 위의 주석으로, 나는 예외가opencv_core244d에서 OpenCV - Brox 광학 흐름 - 예외! 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::FarnebackOpticalFlow은 잘 작동합니다 ...

이상한.

전체 예외입니다 : 내가 코드는 OpenCV의 2.4.3에서 예외가 발생하지만 OpenCV의 2.4.4을 사용하여 디버그 디버그 라이브러리 빌드 사용하고

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

. 내가 OpenCV의 재 컴파일 할 필요가 같은 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

+0

OpenCV ... http : // stuartjames를 다시 컴파일하지 않아도되는 솔루션이있을 것으로 기대하고 있습니다.info/Journal/opencv-brox-optical-flow-sample-possible-fix.aspx –

답변

0

: 내가 OpenCV의 2.4.3을 사용하는 경우

나는이 예외가 OpenGL과 함께.

위와 같은 이상한 예외로 실패하면 다시 컴파일해야합니다. cv::gpu::setGlDevice(0); 명령을 실행하여 OpenCV 설치에 OpenGL이 설치되어 있는지 테스트 할 수 있습니다.

OpenGL은 OpenCV지도 데이터에서 OpenGL 텍스처에 대한 새로운 옵티컬 플로우 알고리즘으로 작동 속도를 높이거나 코드를 단순하게 만들 필요가 있습니다.

그럼, 해결책은 OpenGL을 사용하여 OpenCV를 다시 컴파일하는 것입니다. 이것은 CMake를 사용하여 빌드를 구성 할 때 WITH_OPENGL 상자를 체크함으로써 이루어질 수 있습니다.

당신이 비디오 독자의 GPU 버전을 사용하려는 경우 당신은 또한 WITH_NVCUVID이 CUDA에 포함되어 있지만, 당신이 그것을 요청하지 않는 한 포함되지 않습니다를 체크해야합니다 ...

- 편집 -

폴 후에서 의견을 내 질문에 내 코드의 크기 조정을 수정했습니다.

는 여기에 내가 nkint를 들어, 테스트하고있어 전체 코드입니다 : OpenGL을가 필요

{ 
    // 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

+0

OpenCV를 다시 컴파일하면 Brox를 사용하는 예제가 작동합니다. 이식 할 수 있다는게 무슨 뜻이야? 내 연구 코드는 C++로되어 있으며 변경할 의도가 없습니다. OpenCV 코드는 주로 효율성을 위해 필요한 GPU에서 실행되는 CUDA에 있습니다. –

+0

죄송합니다. 알려 드리고 싶습니다. – nkint

1

아니라, 여러분의 규모 매개 변수 (50.0f)에 문제가있을 수 있습니다. 그것은 너무 큰 것 같습니다. 내가 알기로 이것은 1보다 작아야합니다. 많은 수의 경우 알고리즘이 GPU 메모리를 빠르게 채 웁니다. 또한 확대 (거꾸로?) 이미지 피라미드를 사용하는 것이 적절하지 않을 수 있습니다. 그러나 확실하지 않다.

+0

글쎄, 내가 생각하는 예제 중 하나에서 그 가치를 얻었지만, 그렇다면 확실히 문제가 될 것이다. 나는 연극을하고 어떤 일이 일어날지를 볼 것입니다. –

+0

네가 맞다. 예제에서 값을 가져 왔을 때 감마 값과 스케일 값이 잘못되었습니다. 'cv :: gpu :: BroxOpticalFlow OpticalFlowGPU (0.197f, 50.0f, 0.8f, 10, 77, 10);'작동합니다. –