我正在研究在GPU上进行许多计算的算法。我主要使用oclMat结构,并试图避免从CPU复制到GPU,反之亦然,但是我找不到一种简单的方法来:

  • 将ocl矩阵中的所有元素与特定的单个值(例如,它是float或double)进行比较,并根据
  • 创建逻辑矩阵
  • 创建具有给定大小和类型的oclMat矩阵,并将所有元素初始化为特定值(例如,所有元素均为float且等于1.234567)

  • 例如:
    cv::ocl::oclMat M1 =...
    // DO STUFF WITH M1
    cv::ocl::oclMat logicalM1 = M1>1.55; // compare directly to a single value
    cv::ocl::oclMat logicalM2 = ... ; // i.e. I want a 100x100 CV_32FC1 matrix with all elements set to be equal to 1.234567
    

    通过阅读文档,似乎使用cv::ocl::compare仅适用于相同维度和类型的两个矩阵,因此也许我的第一个请求是不可行的。另一方面,我不知道如何直接在ocl中初始化特定的矩阵(使用cv::Mat我知道它是如何完成的)。

    我认为存在一个简单的解决方法,但是还没有找到一个方法...谢谢!

    最佳答案

    你是对的。好像cv::ocl::compare在输入上仅支持两个cv::oclMat
    但是您可以按以下方式创建用特定值填充的oclMat:

    cv::ocl::oclMat logicalM2(M1.size(), M1.type);
    logicalM2.setTo(cv::Scalar(1.234567));
    cv::ocl::oclMat logicalM1;
    cv::ocl::compare(M1, logicalM2, logicalM1, cv::CMP_GT);
    

    附言我也建议您尝试使用带有透明API的新OpenCV 3.0,这将使在使用OpenCL的GPU上进行处理变得更加容易。

    关于c++ - OpenCV OCL逻辑索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30291509/

    10-10 04:27