CUDA8.0+OpenCV2.4.13+VS2015+Win10+TBB混合编译

欢迎转载,请注明出处。            

废了四整天,终于把这个鬼东西弄出来了,将过程和遇到的问题写在这里分享给大家。

        

Part 1:看安装步骤之前需要注意如下几个问题

1.为什么选择OpenCV 2.4.13而不使用较新的OpenCV3.2或者OpenCV3.3? 

        OpenCV3系列之后,将OpenCV分成了两块,一块是源码部分,另外一块是contrib部分。将库分成了两个部分,用着稍有些麻烦,如下图所示。

CUDA8.0+OpenCV2.4.13+VS2015+Win10+TBB混合编译_第1张图片

        OpenCV2.4.9版本太旧了,一般不支持VS2015,所以也PASS。

        OpenCV2.4.13系列是在OpenCV3.0之后推出的,可以说是OpenCV2系列的顶配版,对于不喜欢使用3系列的同学简直是至宝。如下图,2.4.13版本适用VS10、VS12和

VS13,;2.4.13.2适用于VS15版本,2.4.13.3适用于VSA2017。至于Linux系统的适用情况不是很清楚。

CUDA8.0+OpenCV2.4.13+VS2015+Win10+TBB混合编译_第2张图片

         而且在编译过程中不容易出错....

         我之前用OpenCV3.2编译了3天,几次都出现opencv_cudaarithm、opencv_cudaimgproc、opencv_cudawarping、opencv_cudastereo报错,但是这四个模块不能扔

,必须得编译出来啊.......

        后来发现是里边源码之类的东西不兼容,得改一点东西....   (╯‵□′)╯︵┻━┻      受不了,直接换回2系列。

        开源库这种东西不一定高版本一定比低版本好用,高版本改的人多了,水平杂了,使用起来反而bug多。

        不过还是相信再过段时间OpenCV3系列也会推出集大成之作的。

2.Eigen要不要用

    Eigen是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。Eigen是一个开源库,从3.1.1版本开始遵从MPL2许可。

    那么问题来了,编译的时候要不要用?

    答案是,不要,千万别用,如果是学习,之前的绝对够用,加这个在编译的时候出现了好几个错误,哎,想想看,不作死就不会死....


Part 2:软件下载

1. OpenCV 2.4.13.2(因为我用的是VS15所以使用.2版本):https://opencv.org/releases.html   点击【Win Pack】进行下载

2.CUDA8.0(当然去官网下载咯): https://developer.nvidia.com/cuda-downloads

3.VS2015 :   .....自行想办法....o(*^▽^*)┛

4.TBB :      https://github.com/01org/tbb/releases    有的同学说必须用,有的说可以不用,之前尝试不用结果出错...用了就没错了 = =

5.OpenGL:    99%的电脑都会自带,如果没有去网上下载opengl30.dll 和glu32.dll

                       放在   C:\Windows\System32  和   C:\Windows\SysWOW64    文件夹下即可。

6.Cmake:  https://cmake.org/download/    全文的核心,我下载的是最新的Cmake3.10.0版本


Part 3:软件安装

1.OpenCV 2.4.13安装

        将安装包进行解压,不要有中文路径。解压完成之后去【我的电脑】-【属性】-【高级系统设施】-【高级】-【环境变量】-【系统变量】-【Path】添加OpenCV的x64中bin

路径:F:\OpenCV\x64\vc14\bin       

        OpenCV安装完成,最好跑个小程序测试一下,不给例程啦。

2.CUDA 8.0安装

        CUDA 8.0安装较为简单,把文件存在三个不同的文件夹中即可,并且8.0版本之后不需要在【系统变量】里手动加一些路径,使用起来非常方便。

        建议安装完成之后写一个小程序测试一下环境。

3.TBB 安装

        TBB是一个库,解压即可。

        解压完成之后在【我的电脑】-【属性】-【高级系统设施】-【高级】-【环境变量】-【用户变量】-【Path】中添加两个路径:

        F:\TBB\bin\intel64\vc14

        F:\TBB\include

        之后在【我的电脑】-【属性】-【高级系统设施】-【高级】-【环境变量】-【系统变量】-【Path】中添加一个路径:

        F:\TBB\bin\intel64\vc14

4.Cmake安装

        下一步下一步即可,不需要配置环境。

5.VS2015 安装

        安装过程很简单,附上激活码福利,没激活的顺便激活一下哈:

Visual Studio Professional 2015简体中文版(专业版)

KEY:HMGNV-WCYXV-X7G9W-YCX63-B98R2

Visual Studio Enterprise 2015简体中文版(企业版)

KEY:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

       言归正传,在Win10左下角中找到VS2015的文件夹,在文件夹中找到【vs2015 x64 本机工具命令提示符】输入三条命令:

        cd bin

        cd amd64

        vcvars64.bat


Part 4: Cmake编译

        最恶心的部分,耗时巨长而且出错需要的时间成本很高....

1.打开Cmake

        【Where is the source code】放的是OpenCV的源代码:F:\OpenCV\sources

        【Where to build the linaries】放的是编译好的程序(随便建个文件夹即可):F:/CUDA_OpenCV_2413

        点击【Advanced】按照首字母排序

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

CUDA8.0+OpenCV2.4.13+VS2015+Win10+TBB混合编译_第3张图片

解释一下:

        Visual Studio 没有疑问,就是编译器的名字。

        15/14/13....   这里指的是vc版本,10对应VS2010, 11对应VS2012, 12对应VS2013, 14对应VS2015 ,15对应VS2017

        最后Win64表示电脑是64位系统,不带64的表示电脑是Windows 32位系统,ARM表示芯片是ARM的电脑(貌似是这样,我也不确定,反正肯定不用它)

        所以选择【Visual Studio 14 2015 Win64】

2.第一次Configure

        第一次Configure一定要联网,要下载一些东西的。

        完成之后会出现一片红,之后搜索WITH_CUBLAS  勾选上; WITH_OPENGL 勾选上。

        搜索WITH_TBB 勾选上,再次Configure。

        这次完成之后,再次搜索TBB ,应该还会出现几行红字,在红色的行后边填上对应的路径:

                            TBB_VER_FILE                    路径为:F:/TBB/include/tbb/tbb_stddef.h

                            TBB_ENV_INCLUDE          路径为:F:/TBB/include

                            TBB_ENV_LIB                      路径为:F:/TBB/lib/intel64/vc14/tbb.lib

                            TBB_ENV_LIB_DEBUG     路径为:F:/TBB/lib/intel64/vc14/tbb_debug.lib

          如果没出来这些路径,就在Configure几次,就会出来啦:

CUDA8.0+OpenCV2.4.13+VS2015+Win10+TBB混合编译_第4张图片

3.Generate

        完成上述所说的步骤后点击Generate进行生成,重要的是生成的结果栏里是否有你需要的:CUDA、TBB、OpenGL等等,顺利的话,可以进行下一步了。

CUDA8.0+OpenCV2.4.13+VS2015+Win10+TBB混合编译_第5张图片

4.编译

        点击【Open Project】可以在VS2015中打开这个文件。

        找到右键生成【Build ALL】,应该会有磨磨唧唧2h左右的生成,切换Release,再次【Build All】,整个过程需要4个小时。

        右键下边的【Install】生成。(同样要在Debug下和Release下各生成一次)   20min左右。

5.取出

        回到生成好的文件目录下,找到【Install】文件夹,这个文件夹里边存的就是编译好的CUDA8.0-OpenCV2.4.13+TBB的库啦。


Part 5 :VS上测试新OpenCV库

1.Install文件的搭建

        将前文的【Install】文件夹复制到另外一个盘中,改名以作区分。我改的是【OpenCV_CUDA3413】。

        回到电脑桌面,【我的电脑】-【属性】-【高级系统设施】-【高级】-【环境变量】-【系统变量】-【Path】找到之前的OpenCV路径,删掉。

        换成新的OpenCV路径:F:\OpenCV_CUDA2413\x64\vc14\bin

2.删除CPU-OpenCV的dll文件

        在配置CPU文件时,如果有将bin文件夹中的文件复制到【System32】和【SysWoW64】中,需要删除掉,如果没有,可以跳过这步。

        在两个文件夹内,查找【opencv】,相关文件全部删除,两个文件夹的路径如下:

        C:\Windows\System32

        C:\Windows\SysWOW64                     

3.VS内配置属性页

        打开VS2015,新建一个空项目文件,在【源文件】中新建一个.cu文件。选择x64平台,开始配置。

Debug界面:

      【VC++目录】—【包含目录】:   F:\CUDA8\Development\include

                                                                F:\OpenCV_CUDA2413\include\opencv2

                                                                F:\OpenCV_CUDA2413\include\opencv

                                                                F:\OpenCV_CUDA2413\include

      【VC++目录】—【库目录】:       F:\CUDA8\Development\lib\Win32       (建议Win32和x64都放进去,不会有冲突)

                                                                F:\CUDA8\Development\lib\x64

                                                                F:\OpenCV_CUDA2413\x64\vc14\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界面:

      前三项与Debug相同,第四项【附加依赖项】要将d去掉,变成Release的lib文件。

cudart.lib
opencv_imgproc2413.lib
opencv_calib3d2413.lib
opencv_contrib2413.lib
opencv_core2413.lib
opencv_features2d2413.lib
opencv_flann2413.lib
opencv_gpu2413.lib
opencv_highgui2413.lib
opencv_legacy2413.lib
opencv_ml2413.lib
opencv_nonfree2413.lib
opencv_objdetect2413.lib
opencv_ocl2413.lib
opencv_photo2413.lib
opencv_stitching2413.lib
opencv_superres2413.lib
opencv_ts2413.lib
opencv_video2413.lib
opencv_videostab2413.lib

4.其他配置

        右键.cu文件,【属性】—【配置属性】—【常规】—【项类型】—【CUDA C++】

        右键项目文件,【生成依赖项】—【生成自定义】—选中【CUDA 8.0】

CUDA8.0+OpenCV2.4.13+VS2015+Win10+TBB混合编译_第6张图片

         至此所有配置完成。

5.程序测试

#include "cuda_runtime.h"  
#include "device_launch_parameters.h"  
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include 
#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 
__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");
	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 <<>>(height, width, d_a, d_dst);
	Mat dst(d_dst);
	imshow("原始图像", a);
	imshow("反向图像", dst);
	waitKey();
	return 0;
}
        在该项目文件中,放入一张名为【PeaShooter.jpg】的图像,分别在Debug和Release下测试,结果如下:

CUDA8.0+OpenCV2.4.13+VS2015+Win10+TBB混合编译_第7张图片

        期间遇到N多错误,不过会陆续更新解决方案,看到这里相信也是认真学习的同学啦,点个赞再走呗


     

        








你可能感兴趣的:(CUDA+OpenCV编程)