OpenCV发布时并不包含GPU模块,若要使用GPU加速的OpenCV代码需要重新编译OpenCV。一个英文版本的教程
环境和资源准备
计算机必须有支持CUDA 的NVIDIA GPU,并且装好了驱动程序。
安装CUDA toolkit,本文使用的是CUDA8.0。下载地址
下载OpenCV 3.2 选择的win pack版本,解压到指定文件目录下。下载地址
下载安装CMake。版本使用的是cmake-3.10.1-win64-x64.msi。下载地址
opencv-contirb-3.2.0下载,下载的是3.2.0的zip,解压到指定的目录下。opencv-contirb是opencv的扩展包。下载地址
Eigen下载,下载最近的稳定版本即可,这里使用的是eigen-3.3.3,解压到指定目录下。Eigen是用来库优化矩阵的计算的。下载地址
tbb下载,tbb2017_20161004oss_win.zip,解压到指定目录下。Intel TBB是用来优化OpenCV库函数的多核计算性能的。下载地址
使用CMAKE进行工程配置
打开CMAKE,输入OpenCV的sources路径,以及将要编译的结果路径(自主创建一个文件夹),勾选择Grouped选项。
选择编译器:选择Studio 2013 Win64。编译过程中,会下载第三方依赖库ffmpeg以及ippicv。网速不佳情况下的解决办法。
BUIlD栏配置
展开BILD选项,取消BUILD_DOCS( 若选择还需要其它的依赖)。
CUDA栏配置
展开CUDA选项,CUDA_TOOLKIT_ROOT_DIR应该是CUDA8.0安装的文件目录,如果在你的电脑上安装了多个版本的CUDA,请将该路径修改到CUDA8.0的文件目录下。
CUDA_ARCH_BIN选项能够编译从计算能力2.0-6.1的所有架构的代码,这个可以根据自己的实际情况进行修改,如果不加修改的话,在i7处理器上编译的时间大约是3.5个小时,但是编译之后的代码就可以在任何机器上部署了。
选中CUDA_FAST_MATH选项,将会加速某些数学计算。配置如下:
WITH栏配置
WITH_CUDA,WITH_FFT应该是默认选中的。
选中WITH_CUBLAS,从而可以使用cuBLAS。
选中WITH_EIGN,WITH_TBB
点击Configure,添加目录
OPENCV_EXTRRA_MODULES_PATH: ~/opencv_contrib-3.2.0/modules
EIGEN_INCLUDE_PATH:~/ eigen-eigen-5a0156e40feb
TBB_ENV_iNCLUDE: ~/tbb2017_20161004oss/include
TBB_ENV_LIB: ~/Library/tbb2017_20161004oss/lib/intel64/vc14/tbb.lib
TBB_ENV_LIB_DEBUG: ~/Library/tbb2017_20161004oss/lib/intel64/vc14/tbb_debug.lib
TBB_VER_FILE: ~/Library/tbb2017_20161004oss/include/tbb/tbb_stddef.h
注意已上的“~”都要落实到自己的文件目录下,根据解压的位置选择。
点击Configure,直到没有红色的警告出现为止。
点击Generate,若成功结果类似如下:
点击Open Project,打开VS工程:
VS编译
在VS中点击Solution Explorer,注意将平台选择,我选择的是X64、RELEASE环境,此处根据自己的实际需求来。
因为OpenCv3.1.0在工程中搜索graphcuts.cpp,并打开,
将
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
修改为:
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)
选中CMakeTargets,右键ZERO_CHECK,单独编译一下此工程,看能否成功。如果编译成功,则进行下一步。
右键INSTALL选择build,这一步不仅重新编译而且还将产生的文件拷贝到install目录下。
安静的等待编译结束吧……
测试
新建一个空的控制台程序,配置include路径,配置lib路径,注意在这里都要选择刚编译完的新的路径。
在Linker->Input 中需要导入新编译好的lib,小窍门是找到刚刚生成lib的文件夹,按住shift+右键,选择在此处打开命令行窗口,输入
dir /b > release.txt
然后,粘贴复制吧。
我没有设置环境变量,因此需要继续在属性中Debugging->Environment中添加在PATH=~/bin 这里的bin目录应该根据自己的实际情况填写,是刚刚生成的二进制文件的目录。
新建一个cpp添加代码:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/cudaarithm.hpp>
#include <opencv2/cudafilters.hpp>
#include <opencv2/cudaimgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
try
{
cv::Mat src_host = cv::imread("face.jpg", CV_LOAD_IMAGE_GRAYSCALE); //这里使用自己的测试图片
cv::cuda::GpuMat dst, src;
src.upload(src_host);
cv::cuda::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);
cv::Mat result_host;
dst.download(result_host);
cv::imshow("Result", result_host);
cv::waitKey();
}
catch (const cv::Exception& ex)
{
std::cout << "Error: " << ex.what() << std::endl;
}
std::cin.get();
return 0;
}
成功运行的话,恭喜你!