【问题标题】:OpenCV - Brox Optical Flow - Exception in opencv_core244d!cv::GlBuffer::unbindOpenCV - Brox 光流 - opencv_core244d!cv::GlBuffer::unbind 中的异常
【发布时间】:2013-02-10 17:33:28
【问题描述】:

有没有人设法让 OpenCV 中的 Brox 密集光流算法工作?

这里有一些代码:

{
    // 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 时出现此异常:

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

【问题讨论】:

  • 是否有演示应用程序或任何东西来演示 OpenCV 中包含的该计算的用法?这可能是一个很好的起点……
  • 我找到了这个,但我希望有一个不涉及重新编译 OpenCV 的解决方案...stuartjames.info/Journal/…

标签: c++ opencv image-processing cuda opticalflow


【解决方案1】:

OpenGL 是必需的,但您的比例参数 (50.0f) 也可能存在问题。它似乎太大了。据我了解,这应该小于1。如果是一个很大的数字,算法会很快填满GPU内存。另外,使用扩展(倒置?)图像金字塔可能没有意义。不过也不是很确定。

【讨论】:

  • 嗯,我从我认为的一个例子中得到了这些值,但如果是这样的话,那肯定是个问题。我会演一场,看看会发生什么。
  • 是的,你完全正确。当我从示例中获取我的值时,我得到了错误的伽玛值和比例值。 cv::gpu::BroxOpticalFlow OpticalFlowGPU(0.197f, 50.0f, 0.8f, 10, 77, 10); 工作。
【解决方案2】:

在尝试了其他版本的 OpenCV 并遵循此处包含的信息:http://stuartjames.info/Journal/opencv-brox-optical-flow-sample-possible-fix.aspx

看来我需要用 OpenGL 重新编译 OpenCV。

您似乎可以通过运行以下命令来测试您安装的 OpenCV 是否具有 OpenGL:cv::gpu::setGlDevice(0); 如果失败并出现上述异常异常,那么您需要重新编译。

OpenGL 是必需的,因为 OpenCV 中较新的光流算法将数据映射到 OpenGL 纹理以(我假设)加速操作,或者可能只是为了简化代码。

所以,在这一切之后,解决方案是用 OpenGL 重新编译 OpenCV。这可以通过在使用 CMake 配置构建时勾选 WITH_OPENGL 框来实现。

如果您想使用 GPU 版本的视频阅读器,请确保您还勾选 WITH_NVCUVID,这包含在 CUDA 中,但除非您要求,否则不包含在内...

-- 编辑--

paul 的 cmets 之后,我从问题中更正了代码中的比例因子。

这是我正在测试的完整代码,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
    //...
}

【讨论】:

  • 一旦您设法重新编译 OpenCV,使用 Brox 的示例应该可以工作。你的意思是我可以移植吗?我的研究代码是用 c++ 编写的,我无意改变它。 OpenCV 代码在 CUDA 中主要用于在 GPU 上运行,这是效率所必需的。
  • 对不起,我想写帖子而不是端口
  • 我已经用工作代码更新了我的答案,前提是您的 OpenCV 安装已使用 OpenGL 编译。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
相关资源
最近更新 更多