基于VS2012搭建OpenCL+OpenCV使用环境

  [题外话]近期申请了一个微信公众号:平凡程式人生。有兴趣的朋友可以关注,那里将会涉及更多更新OpenCL+OpenCV以及图像处理方面的文章。

  最近在学习OpenCL,粗略地看了几本书后,就想着搭建OpenCL的编码环境,自己编几个程序练习练习。要编程,那第一步就是要搭建编程环境了。

  我的PC上安装过VS2012,这个节省了不少时间。使用OpenCL编程,不可避免地要使用到图像处理,OpenCV是最佳选择了。对于OpenCV,以前也只是看看书,写过几个小程序,现在也有了用武之地。

1、检测PC对OpenCL的支持情况

  2008年,苹果公司向Khronos Group提交了一份关于跨平台计算框架的草案,该草案由苹果公司开发,并与AMD、IBM、Intel和NVIDIA公司合作逐步完善。这个跨平台计算框架就是OpenCL(Open Computing Language,开放计算语言)。2008年12月8日,OpenCL 1.0技术规范发布。2010年6月14日,OpenCL 1.1发布。2011年11月19日,OpenCL 1.2发布。2013年11月19日,OpenCL 2.0发布。

从OpenCL技术规范的发布历史看,2008年以前的PC一定是不支持OpenCL的。之后的芯片,也会因为年份不同、厂商不同,对OpenCL的版本支持不同。

  我的PC是2013年购买的ThinkPad T430,只支持OpenCL 1.1版本。

  怎么能准确地知道自己PC对OpenCL及OpenGL的支持情况呢?我从网上下载了Geeks3D的GPU Caps Viewer软件。它可以很详细地检测到你的PC的GPU情况,以及对OpenCL/OpenGL/CUDA/Vulkan的支持。

  我的PC有三个OpenCL设备,分别是Intel的CPU Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz、intel的GPU Intel(R) HD Graphics 4000,以及NVIDIA的GPU NVS 5400M。它们对OpenCL的支持情况如图1和图2所示。

  在Geeks3D的GPU Caps Viewer软件中显示了它们各自的计算单元数、主频、OpenCL版本、各种类型memory的大小、work group和work item的数目,还有对2D/3D图像支持的最大分辨率。

  在GPU Caps Viewer软件中还可以查看不同GPU设备下demo情况,如图3和图4所示。运行同一个demo,从主观上查看帧率,NVIDIA的GPU要比Intel的快不少,它的帧率很少有掉到30fps以下的,而Intel的很频繁。

 

图1 Intel CPU/GPU对OpenCL支持情况

图2 NVIDIA GPU对OpenCL支持情况


图3 Intel CPU/GPU的demo

图4 NVIDIA GPU的demo

 

2、OpenCL安装及环境配置

  根据我的PC上GPU的型号,我下载NVIDIA的OpenCL驱动。在下面的网页上下载了cuda_8.0.61.exe:

  https://developer.nvidia.com/cuda-downloads

  安装时默认安装到了C盘,具体目录为:

  C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0

  接下来,我在VS2010中建立新工程,配置了OpenCL的相关路径,对OpenCL安装是否成功做了检测。

首先,创建了Visual C++下的Win32控制台应用程序opencl_test。接着配置OpenCL的路径。在工程属性页的“VC++ 目录”下,配置它的“包含目录”和“库目录”。

  “包含目录”中选择路径:

  C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include

“库目录”中选择路径:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\Win32

需要注意的是,因为我创建的是Win32控制台应用程序,必须选择lib下的Win32目录,而不能选择x64目录。

  “VC++ 目录”下的配置如下图所示:


  接下来对“链接器”的“输入”页面进行配置。在它的“附加依赖项”中添加库OpenCL.lib即可。如下图所示:


3、OpenCV安装及环境配置

  我在下面的网页上下载了OpenCV 2.4.10版本:

https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.10/opencv-2.4.10.exe/download?use_mirror=jaist

  OpenCV 2.4.10版本的安装文件350M多,安装完以后将近4G。所以我把它安装到了比较空闲的G盘。安装目录为:G:\Program Files\opencv\

对于OpenCV的配置,我也是建立VC++下的Win32控制台应用程序。在它的工程属性页的“VC++ 目录”下,也需要配置它的“包含目录”和“库目录”。

  “包含目录”中选择路径:

  G:\Program Files\opencv\build\include

  “库目录”中选择路径:

  G:\Program Files\opencv\build\x86\vc11\lib

  需要说明的是,在目录G:\Program Files\opencv\build\x86\下,有三个目录vc10、vc11和vc12,它们分别对应VS2010、VS2012和VS2013。我安装的是VS2012,所以选择vc11。

  接下来对“链接器”的“输入”页面进行配置。在它的“附加依赖项”中添加下面几个库:

  opencv_imgproc2410d.lib、opencv_core2410d.lib、opencv_highgui2410d.lib、opencv_calib3d2410d.lib。

  注意这些库后面都带字母d,表示是用于debug模式下的库。如果是release版本,需要把字母d去掉。在debug模式下,不能混入release库,反之亦然。

  在目录G:\Program Files\opencv\build\x86\vc12\lib下有几十个lib,需要根据编程需要添加不同的lib。

4、OpenCL+OpenCV环境检测

  在工程的test.cpp文件中输入下面的code,完成了对OpenCL和OpenCV环境的检测。

1.	#include <iostream>  
2.	#include <fstream>  
3.	#include <sstream>  
4.	#include <opencv2/opencv.hpp>  
5.	  
6.	#ifdef __APPLE__  
7.	#include <OpenCL/cl.h>  
8.	#else  
9.	#include <CL/cl.h>  
10.	#endif  
11.	  
12.	using namespace cv;  
13.	  
14.	int main(int argc, char* argv[])  
15.	{  
16.	    cl_int ciErrNum;          
17.	    int width = 0, height = 0;  
18.	    const char* imagename = "F:\\code\\pic\\test01.jpg";  
19.	  
20.	    Mat img = imread(imagename);  
21.	    if (!img.data) {  
22.	        std::cout << "fail to open file. " << std::endl;  
23.	    }  
24.	    Mat gray;  
25.	    cvtColor(img, gray, CV_BGR2GRAY);  
26.	    width = gray.rows;  
27.	    height = gray.cols;  
28.	  
29.	    std::cout << "picture width: " << width << ", height: " << height << std::endl;  
30.	  
31.	    cl_uint platformNum;  
32.	    ciErrNum = clGetPlatformIDs(1, NULL, &platformNum);  
33.	  
34.	    std::cout << "platform number: " << platformNum << std::endl;  
35.	    return 0;  
36.	}

  

  它调用OpenCV的API函数打开一个jpeg图片,将其转化为灰度图,输出了图像的宽和高信息。调用OpenCL的API获取了本机支持OpenCL平台的数目,为2。因为我的PC上有Intel的继承显卡和NVIDIA的独立显卡。

  通过这个小程序,我们验证OpenCL+OpenCV环境是可以正常工作的。之后就可以基于这个环境完成更多的程序设计了。

  这段code运行结果如下:


 

posted on 2017-05-09 08:42  icamera  阅读(615)  评论(0编辑  收藏  举报