OpenCV 3.2.0 +Win10+ CUDA 8.0+ VS2013 编译

OpenCV发布时并不包含GPU模块,若要使用GPU加速的OpenCV代码需要重新编译OpenCV。一个英文版本的教程环境和资源准备计算机必须有支持CUDA 的NVIDIA GPU,并且装好了驱动程序。下载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选项。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/modulesEIGEN_INCLUDE_PATH:~/ eigen-eigen-5a0156e40febTBB_ENV_iNCLUDE: ~/tbb2017_20161004oss/includeTBB_ENV_LIB: ~/Library/tbb2017_20161004oss/lib/intel64/vc14/tbb.libTBB_ENV_LIB_DEBUG: ~/Library/tbb2017_20161004oss/lib/intel64/vc14/tbb_debug.libTBB_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;
}
成功运行的话,恭喜你! 

相关内容推荐