欢迎转载,请注明出处。
废了四整天,终于把这个鬼东西弄出来了,将过程和遇到的问题写在这里分享给大家。
Part 1:看安装步骤之前需要注意如下几个问题
1.为什么选择OpenCV 2.4.13而不使用较新的OpenCV3.2或者OpenCV3.3?
OpenCV3系列之后,将OpenCV分成了两块,一块是源码部分,另外一块是contrib部分。将库分成了两个部分,用着稍有些麻烦,如下图所示。
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系统的适用情况不是很清楚。
而且在编译过程中不容易出错....
我之前用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】之后会进入版本选择界面:
解释一下:
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几次,就会出来啦:
3.Generate
完成上述所说的步骤后点击Generate进行生成,重要的是生成的结果栏里是否有你需要的:CUDA、TBB、OpenGL等等,顺利的话,可以进行下一步了。
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】
至此所有配置完成。
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下测试,结果如下:
期间遇到N多错误,不过会陆续更新解决方案,看到这里相信也是认真学习的同学啦,点个赞再走呗