之前老板已经编译好了OpenCV3.2.0 ,但是好像无法使用ocl模块?

所以我想应该是他当初编译的时候没有选择WITH_OPENCL,所以我决定重新编译一遍。

一、下载CMake并安装

1、我下载的是CMake3.4.0并安装完毕(教程网上有太多 就不重复);

但我运行./configure时出现:

解决办法:yum install ncurses-devel 如果下载不了,就自己手动下载:我是手动下载的:ncurses-devel-5.9-14.20130511.el7_4.x86_64.rpm (然后用rpm命令安装即可)。

2、安装cmake-gui

yum install cmake-gui

检验是否安装成功  :直接运行 cmake-gui  即可出现cmake界面

二、下载安装OpenCV

我是手动去官网下载OpenCV3.2.0.tar.gz的,然后解压在opencv-OpenCL-3.2.0文件夹下。

三、编译OpenCV-OCL

1、新建一个OpenCV3.2_With_OpenCL文件夹

2、终端下运行cmake-gui打开界面

3、像下面那样填写目录,开始编译:(等了很久)

我的出现这个错误:仔细看就是:

a.我试着手动下载这个红色部分提示缺少的文件:ippicv_linux_20151201.tgz

https://raw.githubusercontent.com/Itseez/opencv_3rdparty/81a676001ca8075ada498583e4166079e5744668/ippicv/ippicv_linux_20151201.tgz  在这里下载。如果这个下载不了就在: http://download.csdn.net/download/chu_ying/9432287  下载。

然后,将刚才下载的文件直接拷贝进入opencv3.1源码的下面这个目录:opencv-OpenCL-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e

类似这个目录下。

b.终端下打开cmake-gui 点击configure  就会接着之前失败的地方进行(这次速度很快):

发现那个WITH_OPENCL竟然是自动选上的。

c.点击generate (速度比较快)(没有出现什么错误)

d.在文件夹OpenCV3.2_With_OpenCL下打开终端  运行 make  (出现很多东西 等待。。。)

类似这样的东西。。。感觉等待了一万年。。。

e.接着运行 make install  

这样编译好的OpenCV3.2.0的lib和include原来都在usr/include/下面 ,去找就找到了。(其实最好不搞在这里 开始应该指定目录的)

可以在此运行 opencv_version -v  应该出现像我一样的画面:

这样创建工程时加上库路径和头文件路径等 就OK了。运行了一个简单例子,成功。

奇怪之处:在记录这篇文章之前 我的OpenCL版本是2.0的:

但这次编译之后却变成了1.2的了?tell me why????????哦我知道了,不是编译的原因,而是硬件原因:我的驱动是OpenCL2.0,但我的显卡是Rx 560不支持OpenCL 2.0 只支持OpenCL1.2 !!! ps:大神说:当前能支持OpenCL 2.0的是 AMD GPU基于GCN 1.1或更高版本架构的GPU,比如R9 285支持。R9 3XX很多都支持。另外就是Broadwell处理器架构或更新架构的Intel HD(或Iris) Graphics能支持。

刚刚查了下:GPU型号与OpenCL版本支持关系:https://en.wikipedia.org/wiki/List_of_AMD_graphics_processing_units

Chip series Micro-architecture Fab Supported APIs Introduced with
rendering computing
Vulkan OpenGL[4] Direct3D HSA OpenCL
R100 fixed-pipeline 180 nm
150 nm
No 1.3 7.0 No No Original "ATI Radeon", as well as Radeon DDR, 7000, 7500, VE, and LE models
R200 programmable pixel&vertex pipelines 150 nm 1.4 8.1 8500, 9000, 9200 and 9250
R300 150 nm
130 nm
110 nm
2.0 9.0
11 (FL 9_2)
9500–9800, X300-X600, X1050
R420 130 nm
110 nm
9.0b
11 (FL 9_2)
X700–X850
R520 90 nm
80 nm
9.0c
11 (FL 9_3)
X1300–X1950
R600 TeraScale 1 80 nm
65 nm
3.3 10.0
11 (FL 10_0)
ATI Stream HD 2000 series, HD 3410
RV670 55 nm 10.1
11 (FL 10_1)
ATI Stream APP[5] HD 3450-3870, Mobility HD 2000 and 3000 series
RV770 55 nm
40 nm
1.0 HD 4000 series
Evergreen TeraScale 2 40 nm 4.4 11 (FL 11_0)
12 (FL 11_0)
1.2 HD 5000 series
Northern Islands TeraScale 3 HD 6000 series, and IGP 7000 series
Southern Islands GCN 1st gen 28 nm 1.0 4.5 11 (FL 11_1)
12 (FL11_1)
Yes 1.2, new driver 2.0 possible HD 7000 series
Sea Islands GCN 2nd gen 11 (FL 12_0)
12 (FL 12_0)
2.0 (2.1 in Beta and 2.2 with driver update) Radeon 200 series
Volcanic Islands GCN 3rd gen Radeon 300 series
Arctic Islands GCN 4th gen 14 nm Radeon 400 series
Vega Vega 12 (FL 12_1) Radeon VEGA series

四、运行ocl的例子

但运行ocl的例子时还是报错说:oclMat 不是‘cv::ocl’成员  ??

最近谷歌打不开。

终于知道了:http://blog.csdn.net/jia20003/article/details/69802932  原来OpenCV3.x后使用UMat取代了OpenCV2.x的oclMat!难怪无论是我编译的还是之前老板编译的OpenCV3.2使用oclMat都错的!(不过发现还是要自己编译,最好不用老板编译好的,因为刚刚发现老板编译好的include下没有3rdparty更没有CL文件夹,所以想了下,如果不要用到opencv-ocl模块,还是可以用老板编译的版本;但如果要用opencv-ocl模块,还是用我自己编译的)用UMat就好了!UMat就是以前的oclMat!

1、UMat(ocl)小例

按照这个人的介绍 UMat即是ocl,我的设备支持OpenCL,故启动UMat就是启动了GPU运行。 我这个例子应该是在GPU上,但耗时是341 ms。 

2、对比原opencv程序

原来的纯CPU的程序:

这个耗时只要19ms!!!

3、对比我自己写的纯OpenCL程序

我自己写了一个纯OpenCL的腐蚀:

我这个耗时是129 ms!!!

当然这个没太多可比性,只是一个参考数据!因为UMat那个参杂了Mat到UMat的转化(需要时间),或者可能这个简单的运算并不适合GPU并行?!

后来看了 https://stackoverflow.com/questions/41688751/understanding-the-usage-of-opencl-in-opencv-mat-umat-objects

又用这个例子试了下:main.cpp

#include <opencv2/core/ocl.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace cv::ocl;
using namespace std;int main()
{TickMeter tm;tm.start();//launch OpenCL environment...std::vector<cv::ocl::PlatformInfo> plats;cv::ocl::getPlatfomsInfo(plats);const cv::ocl::PlatformInfo *platform=&plats[0];
//  cout<<"Platform name: "<<platform->name().c_str()<<endl;cv::ocl::Device current_device;platform->getDevice(current_device,0);
//  cout<<"Device name: "<<current_device.name().c_str()<<endl;current_device.set(0);ocl::setUseOpenCL(true);cv::UMat test_ocl_img;imread("/home/jumper/Ecology_OpenCL/erodecontrasttest/test.bmp").copyTo(test_ocl_img);cv::UMat test_gray_img(test_ocl_img.rows,test_ocl_img.cols,CV_8UC1);cvtColor(test_ocl_img, test_gray_img, CV_BGR2GRAY);threshold(test_gray_img, test_gray_img, 40, 255, 0);imwrite("ocltemp.bmp",test_gray_img);cv::UMat element_img;getStructuringElement(MORPH_RECT, Size(2, 2)).copyTo(element_img);erode(test_gray_img, test_gray_img, element_img);tm.stop();std::cout<<"count="<<tm.getCounter()<<" ,process time="<<tm.getTimeMilli()<<" ms."<<std::endl;return 0;
}

结果发现时间还是很慢啊!?个人觉得:这个不适合用OpenCL  这么一点又没什么计算量 时间当然比用纯CPU的API多!

就相当于 杀鸡用牛刀和水果刀的区别 : 牛刀切开鸡脖子比水果刀快  但牛刀重 ,举起来就要花很久  而水果刀轻方便拿!!!
五、总结
刚刚在windows下查看了OpenCV3.1的源码,发现opencv_core和opencv_highgui库下有很多核函数即cl文件:
图中这个cv::split()就是我们以前常用的纯opencv函数纯CPU的!
然后再看下面这个:这个opencv的gpu版本即ocl版本的split()函数,即这个函数启动时会在GPU上运行!看这里有核函数、globalsize及run等

而第一个图的这句话:

CV_OCL_RUN(_m.dims() <= 2 && _mv.isUMatVector(),ocl_split(_m, _mv))

说明,OpenCV3.x版本的纯CPU的API中都有了GPU的判断接口,如果判断是UMat,则启动这个API的GPU版本的函数!否则启动以前的老的纯CPU版本的函数!
所以:只要是硬件条件支持OpenCL、为工程添加所需的OpenCL库及头文件、在main中添加进ocl命名空间、使用UMat ,只要满足这4个条件那么就是在GPU上运行的!!!

#include <opencv2/core/ocl.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace cv::ocl;
using namespace std;int main()
{TickMeter tm;tm.start();//launch OpenCL environment...std::vector<cv::ocl::PlatformInfo> plats;cv::ocl::getPlatfomsInfo(plats);const cv::ocl::PlatformInfo *platform=&plats[0];
//  cout<<"Platform name: "<<platform->name().c_str()<<endl;cv::ocl::Device current_device;platform->getDevice(current_device,0);
//  cout<<"Device name: "<<current_device.name().c_str()<<endl;current_device.set(0);ocl::setUseOpenCL(true);cv::UMat test_ocl_img;imread("/home/jumper/Ecology_OpenCL/erodecontrasttest/test.bmp").copyTo(test_ocl_img);cv::UMat test_gray_img(test_ocl_img.rows,test_ocl_img.cols,CV_8UC1);cvtColor(test_ocl_img, test_gray_img, CV_BGR2GRAY);threshold(test_gray_img, test_gray_img, 40, 255, 0);imwrite("ocltemp.bmp",test_gray_img);cv::UMat element_img;getStructuringElement(MORPH_RECT, Size(2, 2)).copyTo(element_img);erode(test_gray_img, test_gray_img, element_img);tm.stop();std::cout<<"count="<<tm.getCounter()<<" ,process time="<<tm.getTimeMilli()<<" ms."<<std::endl;return 0;
}

像我这个文件中的灰度转换、阈值化、存图、腐蚀都是在GPU上!

当然等谷歌重新开放时我会再次查证!

我刚刚又看了OpenCV3.1的源码:(只是看了一部分,几个库中)

1、发现图像校正、图像轮廓、ml中的所有函数都没有OpenCL加速版本!

2、只要是#include "opencl_kernels_....hpp" 的都有OpenCL版本的API!如:图像分离与合成、形态学操作、阈值化、平滑滤波、边缘检测、Harris角点检测相关的(比如梯度矩阵的最小特征值cornerMinEigenVal())、特征检测、直方图检测、霍夫直线检测、图像缩放、图像的几何变换、图像金字塔等相关的API都有相应的OpenCL版本!

他还说:

通过Mat::getUMat()之后就获取一个UMat对象,同样在UMat对象操作期间,作为父对象Mat也会被LOCK直到子对象UMat销毁之后才可以继续使用。

OpenCV的官方文档说不鼓励在一个方法和一段代码中同时使用Mat与UMat两种方式,因为这样做真的非常危险。此外Mat与UMat还可以相互拷贝,但是这种方式也不是OpenCV官方提倡与推荐的,所以尽量别用这种方式。

参考了 http://www.cnblogs.com/emouse/archive/2013/02/22/2922940.html

Linux编译OpenCV3.2.0-OCL模块并使用相关推荐

  1. opencv3.2教程linux,Linux编译OpenCV3.2.0-OCL模块并使用

    之前老板已经编译好了OpenCV3.2.0 ,但是好像无法使用ocl模块? 所以我想应该是他当初编译的时候没有选择WITH_OPENCL,所以我决定重新编译一遍. 一.下载CMake并安装 1.我下载 ...

  2. ubuntu16.04 编译 opencv3.1.0 (Anaconda)

    在Anaconda环境中编译opencv3并能让python2.7调用. 这一年倾向于写有道云笔记,懒得写博客. 写得有点超级无敌乱,将就看看吧.我只是想用opencv从电影中提取人脸图片而已= = ...

  3. arm oe linux gnueabi 系统,OpenCV ARM移植(交叉编译opencv) arm-oe-linux-gnueabi-gcc编译opencv3.1.0...

     Cmake的安装 OpenCV 2.2以后版本需要使用Cmake生成makefile文件,因此需要先安装cmake. ubuntu下安装cmake比较简单, apt-get install cm ...

  4. csky linux 编译内核,TQ2440的EmbedSky_hello模块编译内核问题及解决

    已在内核代码中添加EmbedSky_hello驱动为例,进行内核编译时候出现了一下几个问题: 1.在 /opt/EmbedSky/linux 2.6.30.4/drivers/char目录下修改&qu ...

  5. linux编译安装openssl3.0.7

    资源地址: /source/index.html 首先 下载,解压 ​ wget https://www.openssl.org/source/openssl-3.0.7.tar.gz​tar -zx ...

  6. 使用CMake与VS2012编译OpenCV3.3.0版本

    OpenCV对应的资源如下: 下载链接如下: https://download.csdn.net/download/qq78442761/10663006 https://download.csdn. ...

  7. linux编译gcc5.1.0,linux编译gcc-5.1.0

    最新的gcc-5.1.0才发布出来,迫不及待地装上试一试. 在外链网址已屏蔽下载gcc-5.1.0 然后解压到目录gcc-5.1.0/ 运行 ./contrib/download_prerequisi ...

  8. VS 2015 64位CMake编译openCV3.1.0必备文件

    用Cmake编译的时候遇到编译出错,原因是下载两个文件的时候下载时间超出了编译设定的响应时间.然后需要在ippcv和ffmpeg中分别添加下列文件 链接:http://pan.baidu.com/s/ ...

  9. Linux编译Opencv3.4.7: relocation R_X86_64_PC32 against `ff_w_ff‘ can not be used when makin with -fPIC

    libavcodec.a(hevc_cabac.o):  relocation R_X86_64_PC32 against `ff_w_ff' can not be used when makin w ...

最新文章

  1. 【js】内置对象array的常见方法的使用
  2. 【FPGA】Buffer专题介绍(一)
  3. 解决无法安装cnpm,cnpm卡顿问题
  4. Linux C编程--string.h函数解析
  5. nginx转发websocket
  6. python编写程序接收字符串_Python字符串操作
  7. matlab中函数或变量无法识别怎么办_用MATLAB巧解微分方程实例分析
  8. asp.net mvc post 后台model_搭建restful api后台
  9. php闭包原理,闭包原理及实例
  10. 13. 为什么我们会需要 Pod?
  11. 直方图均衡化 原理、流程、公式推导及matlab实现
  12. tomcat项目支持跨域访问
  13. Selenium Grid跨浏览器-兼容性测试
  14. JSP javaweb餐厅点餐系统源码(点餐系统)jsp点餐系统网上订餐
  15. SoilGrid 250米土壤质地数据集
  16. mysql的全量备份和增量备份
  17. 《前端》阿里字体库iconfont使用方法
  18. 航空运输安全及鉴定,保障货物成功抵达
  19. 打印1000年到2000年之间的闰年
  20. 生成HTML表格的后台模板代码

热门文章

  1. 云计算机的概念与优势,分布式云计算的概念和优势
  2. 电子病历之EMR和EHR的区别
  3. 关于聚合支付的十大关键词,你认识几个?
  4. 如何打包及运行打包后的前端项目
  5. 南财计算机组成原理第一套试卷,南财在线考试《公共英语3级》三套试卷.DOCX
  6. 集成底座与业务系统对接过程梳理
  7. 为什么选择Simscape Multibody来仿真
  8. Unity实现鼠标打飞碟(Hit UFO)adapter模式
  9. 怎么做好钣金件产品结构设计
  10. 阿里云ecs建站 一键环境配置 图文超详细_liunx下建站,适合纯新手小白