16

如何确定 OpenCV 库是否在 Windows 7 机器上使用 TBB 或 CUDA 或 QT 编译?我应该使用依赖walker,如果是,如何使用?或者有其他方法可以查到吗?

4

5 回答 5

8

您可以通过在 cmdline 中打开 python3 REPL 来了解它:

python3

然后导入opencv:

import cv2

然后打印构建信息:

print(cv2.getBuildInformation())

并查找 CUDA 和相关的 GPU 信息。

于 2019-12-18T14:13:44.597 回答
2

跟进 dpetrini 的回答,您可以添加任何支持以在其中进行正则表达式搜索以完善输出,而不是在构建信息输出中搜索它。

import cv2
import re

cv_info = [re.sub('\s+', ' ', ci.strip()) for ci in cv2.getBuildInformation().strip().split('\n') 
               if len(ci) > 0 and re.search(r'(nvidia*:?)|(cuda*:)|(cudnn*:)', ci.lower()) is not None]
print(cv_info)
['NVIDIA CUDA: YES (ver 10.0, CUFFT CUBLAS FAST_MATH)', 'NVIDIA GPU arch: 75', 'NVIDIA PTX archs:', 'cuDNN: YES (ver 7.6.5)']
于 2020-05-09T14:42:33.823 回答
1

如果 OpenCV 使用 CUDA 功能编译,它将为 getCudaEnabledDeviceCount 函数返回非零值(确保已安装 CUDA)。另一种非常简单的方法是尝试在 OpenCV 中使用 GPU 函数并使用 try-catch。如果抛出异常,则说明您尚未使用 CUDA 编译它。

于 2013-06-30T18:30:45.937 回答
0

对于 CUDA 支持,您可以检查 gpu 模块大小。如果 OpenCV 在没有 CUDA 支持的情况下编译,opencv_gpu.dll 的大小会很小(< 1 MB),它将是一个虚拟包。使用 CUDA 支持构建的 gpu 模块的实际大小约为 70 MB,用于一种计算能力。

于 2013-06-28T07:25:17.237 回答
0
bool _cudaSupported  = false;

...
// Obtain information from the OpenCV compilation
// Here is a lot of information.
const cv::String str = cv::getBuildInformation();

// Parse looking for "Use Cuda" or the option you are looking for.
std::istringstream strStream(str);

std::string line;
while (std::getline(strStream, line))
{
    // Enable this to see all the options. (Remember to remove the break)
    //std::cout << line << std::endl;

    if(line.find("Use Cuda") != std::string::npos)
    {
        // Trim from elft.
        line.erase(line.begin(), std::find_if(line.begin(), line.end(),
        std::not1(std::ptr_fun<int, int>(std::isspace))));

        // Trim from right.
        line.erase(line.begin(), std::find_if(line.begin(), line.end(),
        std::not1(std::ptr_fun<int, int>(std::isspace))));

        // Convert to lowercase may not be necessary.
        std::transform(line.begin(), line.end(), line.begin(), ::tolower);
        if (line.find("yes") != std::string::npos)
        {
            std::cout << "USE CUDA = YES" << std::endl;
            _cudaSupported = true;
            break;
        }
    }
}
于 2018-03-24T18:09:53.570 回答