无法在OpenCV GPU(CUDA)中创建过滤器

时间:2017-08-01 06:36:39

标签: opencv gpu

系统信息(版本)

  • OpenCV => 3.2
  • 操作系统/平台=> Windows 10 64位
  • 编译器=> Visual Studio 2015社区
  • CUDA工具包版本=> 8.0

详细说明

我正在使用基于GPU的功能和操作。我自己构建了支持CUDA的OpenCV,大多数GPU功能和操作都运行良好。但是,当涉及过滤相关功能(如createGaussianFiltercreateSobelFilter时)会触发以下异常:

C:\ OpenCV \ opencv-3.2.0 \ modules \ cudafilters \ src \ filtering.cpp:414:错误:(-215)rowFilter_!= 0在函数`anonymous-namespace'中: :SeparableLinearFilter :: SeparableLinearFilter

要重现的代码

// C++ code example
// A very simple snnipet
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudafilters.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    try
    {
        Ptr<cuda::Filter> filterX = cuda::createSobelFilter(CV_64F, CV_64F, 1, 0, 3, 1, BORDER_DEFAULT); // x direction
    }
    catch (cv::Exception& e)
    {
        const char* err_msg = e.what();
        std::cout << "exception caught: " << err_msg << std::endl;
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您可以找到here代码来测试Sober过滤器的CUDA版本。

在我看来,这是OpenCV开发人员的选择(CUDA API允许双精度计算,因为我认为这是一段很长的时间)。不接受CV_64F或双精度浮点,因为效率较低,更好的精度不值得性能下降。计算机图形不需要这么精确,因此GPU架构具有更多单精度单位(更多信息here,2010)。

另见CUDA faq

注意:游戏GPU与专业GPU尤其如此(参见here,2015):

  

NVIDIA GPU摘要

     

NVIDIA的GTX系列因其出色的FP32性能而闻名   FP64性能非常差。性能通常是范围   在1:24(开普勒)和1:32(麦克斯韦尔)之间。例外情况是这样的   GTX Titan卡模糊了消费者GTX之间的界限   系列和专业的特斯拉/ Quadro卡。

     

开普勒架构Quadro和特斯拉系列卡提供完整版   双精度性能,1:3 FP32。但是,随着Quadro   M6000,NVIDIA决定只提供最低限度的FP64性能   只给它1:32的FP32能力并宣传M6000为   最好的显卡而不是像最好的图形+计算卡   Quadro K6000。

     

AMD GPU

     与FP32相比,AMD GPU在FP64上的表现相当不错。大多数AMD卡   (包括消费者/游戏系列)将提供1:3和1:8的FP32   FP64的性能。 AMD Tahiti架构在这些测试中进行了测试   这里的基准测试不会遇到与FP64相同的问题   NVIDIA的GTX系列,性能为1:4。较新的夏威夷   架构消费级GPU预计将提供1:8   性能

     

FirePro W9100,W8100和S9150将为您提供令人难以置信的FP64   1:2 FP32性能。

     总的来说,AMD GPU在良好的双精度方面享有盛誉   性能比与NVIDIA同行相比。