您的位置:首页 > 运维架构

Win10+OpenCV2.4.13+VS2013+CUDA7.5配置教程

2018-01-24 13:54 453 查看
首先说明一下,OpenCV2.3.13之前的版本不支持CUDA7.5,因此配置总是会出问题,在OpenCV官网下载OpenCV2.4.13版本,此版本支持CUDA7.5。

另外OpenCV2.4.13是支持VS2013的,但不清楚支不支持VS2015及以上,OpenCV官网上还有OpenCV2.4.13.2版本支持VS2015,我并没有测试,慎用。

下面开始教程:

1.    下载TBB,解压。

解压完成之后在【我的电脑】-【属性】-【高级系统设施】-【高级】-【环境变量】-【用户变量】-【Path】中添加两个路径:
      %TBB路径%\bin\intel64\vc12(选择vc12还是vc14要看你装的VS版本,VS2013对应vc12)
      %TBB路径%\include
之后在【我的电脑】-【属性】-【高级系统设施】-【高级】-【环境变量】-【系统变量】-【Path】中添加一个路径:%TBB路径%\bin\intel64\vc12
 

2.    下载CUDA7.5并安装,安装完成后,理论上应该自动设置好了环境变量,可以自己去查看

3.    下载CMake3.8.1并安装,最新版本的CMake有问题,OpenCV2.4.13不兼容,安装时注意勾选一个类似叫add to system path 的选项。

4.    打开CMake这样选择



点击【Configure】之后会进入版本选择界面:
                       


第一个框选择对应的VS版本,注意选Win64版本,然后finish,等。

然后是这个界面



在WITH里勾上WITH_CUBLAS、WITH_OPENGL 、WITH_TBB.





在CUDA里这样选,勾上CUDA_FAST_MATH。



(这里可能对于高级显卡配置时要做相应更改,如果要改就把第二个红框里选上架构,具体架构要在NVIDA官网查,还要查Compute Capability并将其填到第一个红框里,我在官网查的自己GPU运算能力有5.0,按照网上的做法在第一个框内填写为3.0 3.5 5.0,第二个红框选的Kepler,能成功配置出来但不能跑代码(提示Invalid device symbol错误);若第二个框选的Fermi,第一个框内填写为2.0 2.1(2.0),跑代码也会出错。所以最后自己选择不做更改,让CMake自己决定,编译出来是成功跑出代码了的。)
再次点击configure,出现如下界面



再次Configure,完成后再点Generate,完成后再点open project。
5.    等待加载完成,打开VS的视图-其他窗口-属性管理器(Properties Manager),
展开ALL_BUILD,双击Microsoft.Cpp.x64.user,
                                                                     


通用属性-VC++中,将可执行目录、包含目录、库目录里的自己添加的路径都删除,保留默认路径,像这样
                       


然后选择Debug模式,x64,默认是Win32,可以在那个框中下拉有一个配置管理器里设置,不会的自己百度:)



然后右键CMake Target下的INSTALL,选择第一项,生成。大约一个半小时后,生成成功以后如果没有报错,切换到Release模式,再次在INSTALL下生成。再过一个半小时,配置完成。

新建一个NVIDA项目,再次切换到属性管理器,和之前一样,Debug x64模式下:双击Microsoft.Cpp.x64.user,配置【VC++目录】—【包含目录】: 

(这里的E:\ProgramData\CV_build II为你用CMake生成的工程存放的目录)
C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v7.5\include
E:\ProgramData\CV_build II\install\include\opencv
E:\ProgramData\CV_build II\install\include\opencv2
E:\ProgramData\CV_build II\install\include
%TBB路径%\include
 
【VC++目录】—【库目录】:     
C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v7.5\lib\Win32
C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v7.5\lib\x64
E:\ProgramData\CV_buildII\install\x64\vc12\lib
% TBB路径%\lib
 
【链接器】—【附加依赖项】: 包含CUDA和OpenCV的所有依赖项
cudart.lib
opencv_imgproc2413d.lib
opencv_calib3d2413d.lib
opencv_contrib2413d.lib
opencv_core2413d.lib
opencv_features2d2413d.lib
opencv_flann2413d.lib
opencv_gpu2413d.lib
opencv_highgui2413d.lib
opencv_legacy2413d.lib
opencv_ml2413d.lib
opencv_nonfree2413d.lib
opencv_objdetect2413d.lib
opencv_ocl2413d.lib
opencv_photo2413d.lib
opencv_stitching2413d.lib
opencv_superres2413d.lib
opencv_ts2413d.lib
opencv_video2413d.lib
opencv_videostab2413d.lib
 
Release模式也可以配置,前面步骤一样,最后链接器配置为除了第一个lib外其他lib末尾去掉d字母,如opencv_videostab2413.lib。(但是这两个不能一起配置的,不然会报错。只用配置Debug版就够了。如果有人实在需要Release版,可以给我留言我再改教程。网上一些人写的分别在Debug|x64和Release|x64编辑Microsoft.Cpp.x64.user的方法我试的是都不行,浪费了我好长时间。。。)

至此,配置完成了。//测试程序(此为在随便网上找的)
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <cuda.h>
#include <cuda_device_runtime_api.h>
#include <opencv2\gpu\gpu.hpp>
#include <opencv2\gpu\gpumat.hpp>
#include <opencv2\opencv.hpp>
#include <opencv.hpp>
#include <stdio.h>
#include <iostream>
#include <memory>
#include "opencv2/gpu/device/common.hpp"
#include "opencv2/gpu/device/reduce.hpp"
#include "opencv2/gpu/device/functional.hpp"
#include "opencv2/gpu/device/warp_shuffle.hpp"
using namespace std;
using namespace cv;
using namespace gpu;
template <int nthreads>
__global__ void compute_kernel(int height, int width, const PtrStepb img, PtrStepb dst)
{
const int x = blockIdx.x * blockDim.x + threadIdx.x; //x方向检索
const int y = blockIdx.y * blockDim.y + threadIdx.y; //y方向检索
const uchar* src_y = (const uchar*)(img + y*img.step); //原图像
uchar* dst_y = (uchar*)(dst + y*dst.step);

if (x < width && y < height)
{
dst_y[3 * x] = 255 - src_y[3 * x]; //3通道彩色图像处理
dst_y[3 * x + 1] = 255 - src_y[3 * x + 1];
dst_y[3 * x + 2] = 255 - src_y[3 * x + 2];
}
}
int main()
{
Mat a = imread("PeaShooter.jpg"); //把测试图片放在和自己建的工程的cpp文件同目录下,或者设置为绝对路径
GpuMat d_a(a); //GPUMat
GpuMat d_dst(d_a.size(), CV_8UC3);
int width = a.size().width; //横向,x方向
int height = a.size().height; //纵向,y方向

const int nthreads = 256;
dim3 bdim(nthreads, 1);
dim3 gdim(divUp(width, bdim.x), divUp(height, bdim.y));

compute_kernel<nthreads> <<<gdim, bdim >>>(height, width, d_a, d_dst);
Mat dst(d_dst);
imshow("原始图像", a);
imshow("反向图像", dst);
waitKey();
return 0;
}


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv cuda