基於VS2012搭建OpenCL+OpenCV使用環境

  [題外話]近期申請了一個微信公衆號:平凡程式人生。有興趣的朋友能夠關注,那裏將會涉及更多更新OpenCL+OpenCV以及圖像處理方面的文章。ios

  最近在學習OpenCL,粗略地看了幾本書後,就想着搭建OpenCL的編碼環境,本身編幾個程序練習練習。要編程,那第一步就是要搭建編程環境了。編程

  個人PC上安裝過VS2012,這個節省了很多時間。使用OpenCL編程,不可避免地要使用到圖像處理,OpenCV是最佳選擇了。對於OpenCV,之前也只是看看書,寫過幾個小程序,如今也有了用武之地。小程序

一、檢測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圖像支持的最大分辨率。ui

  在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

 

二、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便可。以下圖所示:


三、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\下,有三個目錄vc十、vc11和vc12,它們分別對應VS20十、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。

四、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運行結果以下:

相關文章
相關標籤/搜索