2

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
4

2 に答える 2

0

OpenCV の他のバージョンを試し、ここに含まれる情報に従っている場合: http://stuartjames.info/Journal/opencv-brox-optical-flow-sample-possible-fix.aspx

OpenCV を OpenGL で再コンパイルする必要があるようです。

コマンドを実行することで、OpenCV のインストールに OpenGL があるかどうかをテストできるようcv::gpu::setGlDevice(0);です。上記のような奇妙な例外で失敗した場合は、再コンパイルする必要があります。

OpenCV の新しいオプティカル フロー アルゴリズムはデータを OpenGL テクスチャにマップして操作を高速化したり、コードを単純にしたりするため、OpenGL が必要です。

したがって、このすべての後、解決策は OpenCV を OpenGL で再コンパイルすることです。WITH_OPENGLこれは、CMake を使用してビルドを構成するときにボックスにチェックを入れることで実現できます。

ビデオ リーダーの 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
    //...
}
于 2013-03-15T10:57:19.077 に答える